Download OpenAPI specification:
The Portal API provides programmatic access to the public-facing resources of a Huwise Data Product Marketplace. It is primarily a read-only API, exposing high-level portal objects such as navigation menus, identity providers, glossary terms, and pages (both studio and code editor). It also supports form submission, enabling automated workflows for data collection and change requests.
This API is designed for portal developers building custom front-ends, administrators automating workflows, or projects requiring a fully headless portal experience. It differs from the Explore API, which focuses on discovering and consuming data assets, and from the Automation API, which provides administrative management of portal objects and data assets.
| slug | string The unique slug identifier of the page, used in the URL |
| uid | string The unique identifier of the page |
| title | string The title of the page |
| updated_at | string <date-time> The date and time the page was last updated (UTC) |
| is_restricted | boolean Whether the page requires specific permissions to access |
{- "slug": "air-quality-dashboard",
- "uid": "pa_8f3km9",
- "title": "Air Quality Dashboard",
- "updated_at": "2026-01-15T14:30:00Z",
- "is_restricted": false
}| slug | string The unique slug identifier of the page, used in the URL |
| uid | string The unique identifier of the page |
| title | string The title of the page |
| description | string The description of the page |
| updated_at | string <date-time> The date and time the page was last updated (UTC) |
object (StudioPageContent) The content structure of a studio page, as designed in the visual editor. |
{- "slug": "air-quality-dashboard",
- "uid": "pa_8f3km9",
- "title": "Air Quality Dashboard",
- "description": "Real-time air quality metrics and historical trends",
- "updated_at": "2026-01-15T14:30:00Z",
- "content": {
- "data_providers": { },
- "blocks": { },
- "layouts": { },
- "filters": { }
}
}List all published studio pages accessible to the current user. Returns page summaries without content. Use the retrieve endpoint to get the full page content.
{- "total_count": 18,
- "next": null,
- "previous": null,
- "results": [
- {
- "slug": "air-quality-dashboard",
- "uid": "pa_8f3km9",
- "title": "Air Quality Dashboard",
- "updated_at": "2026-01-15T14:30:00Z",
- "is_restricted": false
}
]
}Retrieve a single studio page by its slug, including its full content (visual blocks, layouts, data providers, and filters).
| slug required | string Example: my-page The unique slug identifier of the resource |
{- "slug": "air-quality-dashboard",
- "uid": "pa_8f3km9",
- "title": "Air Quality Dashboard",
- "description": "Real-time air quality metrics and historical trends",
- "updated_at": "2026-01-15T14:30:00Z",
- "content": {
- "data_providers": { },
- "blocks": { },
- "layouts": { },
- "filters": { }
}
}| slug | string The unique slug identifier of the page, used in the URL |
| title | string The title of the page |
| updated_at | string <date-time> The date and time the page was last updated (UTC) |
| is_restricted | boolean Whether the page requires specific permissions to access |
{- "slug": "custom-analytics",
- "title": "Custom Analytics",
- "updated_at": "2026-02-10T09:15:00Z",
- "is_restricted": false
}| slug | string The unique slug identifier of the page, used in the URL |
| title | object The title of the page as a multilingual object, keyed by language code |
object The page content as multilingual objects | |
| updated_at | string <date-time> The date and time the page was last updated (UTC) |
{- "slug": "custom-analytics",
- "title": {
- "en": "Custom Analytics",
- "fr": "Analyses personnalisées"
}, - "content": {
- "html": {
- "en": "<div class=\"analytics-container\"><h1>Analytics</h1></div>",
- "fr": "<div class=\"analytics-container\"><h1>Analyses</h1></div>"
}, - "css": {
- "en": ".analytics-container { max-width: 1200px; margin: 0 auto; }",
- "fr": ".analytics-container { max-width: 1200px; margin: 0 auto; }"
}
}, - "updated_at": "2026-02-10T09:15:00Z"
}| slug | string The unique slug identifier of the page, used in the URL |
| title | string The title of the page in the requested language |
object The page content in the requested language | |
| updated_at | string <date-time> The date and time the page was last updated (UTC) |
{- "slug": "custom-analytics",
- "title": "Custom Analytics",
- "content": {
- "html": "<div class=\"analytics-container\"><h1>Analytics</h1></div>",
- "css": ".analytics-container { max-width: 1200px; margin: 0 auto; }"
}, - "updated_at": "2026-02-10T09:15:00Z"
}List all published code editor pages accessible to the current user. Returns page summaries without content. Use the retrieve endpoint to get the full page content.
{- "total_count": 18,
- "next": null,
- "previous": null,
- "results": [
- {
- "slug": "custom-analytics",
- "title": "Custom Analytics",
- "updated_at": "2026-02-10T09:15:00Z",
- "is_restricted": false
}
]
}Retrieve a single code editor page by its slug, including its full multilingual content.
| slug required | string Example: my-page The unique slug identifier of the resource |
{- "slug": "custom-analytics",
- "title": {
- "en": "Custom Analytics",
- "fr": "Analyses personnalisées"
}, - "content": {
- "html": {
- "en": "<div class=\"analytics-container\"><h1>Analytics</h1></div>",
- "fr": "<div class=\"analytics-container\"><h1>Analyses</h1></div>"
}, - "css": {
- "en": ".analytics-container { max-width: 1200px; margin: 0 auto; }",
- "fr": ".analytics-container { max-width: 1200px; margin: 0 auto; }"
}
}, - "updated_at": "2026-02-10T09:15:00Z"
}Retrieve a single code editor page by its slug, with content localized to the specified language.
| slug required | string Example: my-page The unique slug identifier of the resource |
| language required | string = 2 characters Example: en A 2-letter language code (ISO 639-1) |
{- "slug": "custom-analytics",
- "title": "Custom Analytics",
- "content": {
- "html": "<div class=\"analytics-container\"><h1>Analytics</h1></div>",
- "css": ".analytics-container { max-width: 1200px; margin: 0 auto; }"
}, - "updated_at": "2026-02-10T09:15:00Z"
}Endpoints for interacting with published forms: retrieving their content, submitting responses, and managing submissions. Forms are composed of sections containing input blocks (text, number, choice, date, location, image, etc.). POST endpoints require authentication via API key. To build, configure, or publish forms, refer to the Automation API.
Form submissions
A form submission represents a single response provided by a user through a published form. Submissions are always tied to the specific published version of the form that was active at the time of submission.
A submission contains:
pending, approved, or rejected when moderation is enabled, and always approved when moderation is disabledenable_frontoffice_submission_edition is activated, allowing users to view their submitted data and submit a revision from the front officeTo list, update, or delete submissions, use the Automation API.
| title | string The title of the form |
| description | string The description displayed at the top of the form |
| default_language | string The default language of the form (ISO 639-1 code) |
| other_languages | Array of strings Other available languages for the form |
Array of objects The form sections. Each section contains input blocks. Available block types include: text, number, contact, choice, advanced_choice, autofill, boolean, location_picker, location_search, date_time, url, image, legal, keywords, siret, and linked_datasets. | |
| enable_recaptcha | boolean Whether reCAPTCHA verification is enabled on this form |
| ending | object The form ending configuration, displayed after a successful submission. Can be a thank-you message, a page redirect, or an external URL redirect. |
{- "title": "Customer Feedback Survey",
- "description": "Help us improve our services by sharing your experience.",
- "default_language": "en",
- "other_languages": [
- "fr",
- "de"
], - "sections": [
- {
- "title": "Personal Information",
- "blocks": [
- {
- "field_id": "satisfaction_rating",
- "type": "choice",
- "label": "How would you rate our service?",
- "required": true,
- "unique": true
}
]
}
], - "enable_recaptcha": false,
- "ending": { }
}| is_submissions_quota_reached | boolean Whether the submission quota has been reached |
{- "is_submissions_quota_reached": false
}| is_valid | boolean Whether the submission passed validation |
Array of objects List of validation errors (empty if submission is valid) |
{- "is_valid": true,
- "errors": [
- {
- "field": "cat_name",
- "message": "This field is required."
}
]
}Retrieve the latest published version of a form by its slug. Returns the form structure including sections, input blocks, and configuration.
| slug required | string Example: my-page The unique slug identifier of the resource |
{- "title": "Customer Feedback Survey",
- "description": "Help us improve our services by sharing your experience.",
- "default_language": "en",
- "other_languages": [
- "fr",
- "de"
], - "sections": [
- {
- "title": "Personal Information",
- "blocks": [
- {
- "field_id": "satisfaction_rating",
- "type": "choice",
- "label": "How would you rate our service?",
- "required": true,
- "unique": true
}
]
}
], - "enable_recaptcha": false,
- "ending": { }
}Check whether the submission quota has been reached for a given form. When the quota is reached, new submissions are rejected. Use this endpoint before displaying the form to avoid a poor user experience.
| slug required | string Example: my-page The unique slug identifier of the resource |
{- "is_submissions_quota_reached": false
}Create a new form submission. The submission data should be sent as multipart/form-data with a data field containing a JSON object. Structure the data using the technical IDs of each form block as keys.
Authentication: No authentication is needed if the form's access type is set to open. Use an API key for forms with restricted or authenticated access. This endpoint is rate-limited.
If moderation is enabled on the form, the submission will have a pending status until approved or rejected by a moderator. If moderation is disabled, the submission is always approved.
Important: Use the form's slug (not the uid) in the endpoint URL.
To list, update, or delete submissions, use the Automation API.
| slug required | string Example: my-page The unique slug identifier of the resource |
| data | string JSON-encoded form field values. Keys are block technical identifiers, values depend on the block type. |
{- "is_valid": true,
- "errors": [
- {
- "field": "cat_name",
- "message": "This field is required."
}
]
}Retrieve a specific form submission by its identifier. If a revision (change request) exists, it is returned. Otherwise, only the original submission is returned.
| slug required | string Example: my-page The unique slug identifier of the resource |
| submission_uid required | string Example: 7c9519d9-62fc-4a8a-a5ef-5213aff7f55e The unique identifier of the submission (UUID) |
{- "cat_name": "Rio",
- "cat_age": 5,
- "cat_breed": [
- "Siberian"
], - "contact": {
- "email": "harry@cover.com"
}, - "comments": null
}Submit a change request for an existing form submission. This endpoint is only available when enable_frontoffice_submission_edition is activated on the form.
If moderation is disabled, the submission is updated directly. If moderation is enabled, a change request (revision) is created instead. Only one change request can exist for a submission at a time; a new request replaces any previous pending one from the same user.
The data format is the same as for the submit endpoint. This endpoint requires authentication via API key and is rate-limited.
| slug required | string Example: my-page The unique slug identifier of the resource |
| submission_uid required | string Example: 7c9519d9-62fc-4a8a-a5ef-5213aff7f55e The unique identifier of the submission (UUID) |
| data | string JSON-encoded form field values. Keys are block technical identifiers, values depend on the block type. |
{- "is_valid": true,
- "errors": [
- {
- "field": "cat_name",
- "message": "This field is required."
}
]
}Retrieve the binary content of an image embedded in a form definition (e.g., an image used in a block label or description). Returns the raw image data with the appropriate content type.
| slug required | string Example: my-page The unique slug identifier of the resource |
| storedfile_id required | string Example: 42 The identifier of the stored image file |
{- "error_code": "not_found",
- "message": "Not found."
}| uid | string The unique identifier of the glossary term |
| name | string The display name of the glossary term |
| aliases | Array of strings Alternative names for this glossary term |
| description | string The description of the glossary term. Can be excluded by setting the |
{- "uid": "te_abc123",
- "name": "API",
- "aliases": [
- "Application Programming Interface",
- "Web API"
], - "description": "A set of protocols and tools for building software applications"
}List all glossary terms. Results are not paginated.
| search | string Search in display names and aliases |
| include_description | boolean Default: true Whether to include the description field in the response |
[- {
- "uid": "te_abc123",
- "name": "API",
- "aliases": [
- "Application Programming Interface",
- "Web API"
], - "description": "A set of protocols and tools for building software applications"
}
]Retrieve a single glossary term by its unique identifier.
| uid required | string Example: te_abc123 The unique identifier of the glossary term |
| include_description | boolean Default: true Whether to include the description field in the response |
{- "uid": "te_abc123",
- "name": "API",
- "aliases": [
- "Application Programming Interface",
- "Web API"
], - "description": "A set of protocols and tools for building software applications"
}Endpoints for exploring relationships between assets. Requires the Marketplace Experience to be enabled.
| relation_type | string The type of relationship between the two assets |
object The related asset |
{- "relation_type": "derived_from",
- "asset": {
- "uid": "da_7x9k2m",
- "title": "Monthly Air Quality Measurements",
- "asset_type": "dataset"
}
}List all assets that use the specified asset. Requires the Marketplace Experience to be enabled. Results are paginated.
| asset_uid required | string Example: da_abc123 The unique identifier of the asset |
| limit | number [ 0 .. 1000 ] Default: 20 Example: limit=20 The maximum number of results returned by the API when the response is paginated. Tip: You can make a request with the parameter "limit" set to 0 to get only the metadata ("results" property will contain an empty array). |
| offset | number The number of results to skip before beginning the listing in case of a paginated response |
| relation_type | Array of strings Filter by one or more relation types |
| category | string Filter by asset category label |
| is_showcase | boolean Filter by showcase assets |
{- "total_count": 18,
- "next": null,
- "previous": null,
- "results": [
- {
- "relation_type": "derived_from",
- "asset": {
- "uid": "da_7x9k2m",
- "title": "Monthly Air Quality Measurements",
- "asset_type": "dataset"
}
}
]
}List all assets that are sources of the specified asset. Requires the Marketplace Experience to be enabled. Results are paginated.
| asset_uid required | string Example: da_abc123 The unique identifier of the asset |
| limit | number [ 0 .. 1000 ] Default: 20 Example: limit=20 The maximum number of results returned by the API when the response is paginated. Tip: You can make a request with the parameter "limit" set to 0 to get only the metadata ("results" property will contain an empty array). |
| offset | number The number of results to skip before beginning the listing in case of a paginated response |
| relation_type | Array of strings Filter by one or more relation types |
| category | string Filter by asset category label |
| is_showcase | boolean Filter by showcase assets |
{- "total_count": 18,
- "next": null,
- "previous": null,
- "results": [
- {
- "relation_type": "derived_from",
- "asset": {
- "uid": "da_7x9k2m",
- "title": "Monthly Air Quality Measurements",
- "asset_type": "dataset"
}
}
]
}Endpoints for listing active SSO providers configured on the domain. These endpoints provide the information needed to build the login page (provider names, login links, and labels). They do not cover identity provider management or authentication configuration.
| provider_type | string Enum: "SAML" "OIDC" "PROCONNECT" The protocol used by the identity provider |
| provider_name | string The internal name of the identity provider |
| login_link | string The URL to initiate the authentication flow with this provider |
| login_link_label | string The label displayed on the login button for this provider |
| is_default_login | boolean Whether this provider is used as the default login option |
{- "provider_type": "SAML",
- "provider_name": "Corporate SSO",
- "login_link": "/login/saml/?idp=corporate-sso",
- "login_link_label": "Sign in with Corporate SSO",
- "is_default_login": false
}List active SSO providers configured on the domain. Returns the information needed to display authentication options on the login page. Providers are ordered by type (PROCONNECT first, then SAML, then OIDC).
| lang | string Example: lang=en Language code for login link labels |
{- "total_count": 18,
- "next": null,
- "previous": null,
- "results": [
- {
- "provider_type": "SAML",
- "provider_name": "Corporate SSO",
- "login_link": "/login/saml/?idp=corporate-sso",
- "login_link_label": "Sign in with Corporate SSO",
- "is_default_login": false
}
]
}