{"openapi":"3.0.3","info":{"title":"Acceldata Data Products API","version":"2026-09-30","description":"Public API surface of the ADOC Data Products feature: listing, search, and filter for the Manage and Marketplace views, lifecycle operations (create, update, publish, delete), and the sub-resources shown on a Data Product's detail page.\n\nConventions\n- Pagination: page is 0-based; meta.count is the total number of matches.\n- Sorting: sortBy=<field>:ASC|DESC. Unknown fields are ignored.\n- Multi-value query parameters are comma-separated.\n- IDs are returned as strings in responses; several request bodies take numeric IDs.\n- marketplace=true selects the consumer (Marketplace) context on read endpoints."},"servers":[{"url":"https://{tenant}.acceldata.app","variables":{"tenant":{"default":"se-demo","description":"ADOC tenant subdomain"}}}],"security":[{"accessKey":[],"secretKey":[]},{"bearerAuth":[]}],"tags":[{"name":"Data Products","description":"Search, filter, and manage the lifecycle of Data Products, including create, retrieve, update, publish, unpublish, and delete."},{"name":"Detail","description":"Retrieve the sub-resources shown on a Data Product's detail page, including its member assets, health scores, Quality SLA coverage, policies, lineage, and documentation."},{"name":"Reviews","description":"Submit and manage consumer ratings, reviews, and threaded replies on a published Data Product."},{"name":"Sharing","description":"Grant and revoke user group access to a Data Product."},{"name":"Tags","description":"Associate and manage tags on Data Products, using the same shared tag library used for assets, policies, and other entities in ADOC."},{"name":"Glossary Terms","description":"Link and unlink business glossary terms to a Data Product."},{"name":"Custom Fields","description":"Define and manage the administrator-configured custom fields that extend the standard Data Product form."}],"paths":{"/catalog/api/v1/data-products":{"get":{"tags":["Data Products"],"operationId":"listDataProducts","summary":"List, search and filter data products (Manage and Marketplace)","description":"Returns a paginated list of Data Products. The same endpoint serves two views:\n\n- Manage: pass listing=userOnly&includePermissions=true to retrieve the Data Products the caller can manage.\n- Marketplace: pass status=published&marketplace=true to retrieve the published Data Products available for discovery.\n\nSupports filtering by name, status, owner, tags, glossary terms, reliability score range, and custom field values.","parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/SortBy"},{"name":"name","in":"query","description":"Search. Case-insensitive substring match on product name.","schema":{"type":"string"},"example":"risk"},{"name":"status","in":"query","description":"Case-insensitive.","schema":{"type":"string","enum":["draft","published","DRAFT","PUBLISHED"]}},{"name":"owner","in":"query","description":"Comma-separated owner emails.","schema":{"type":"string"},"example":"john.doe@acceldata.io,jane.doe@acceldata.io"},{"name":"tagKeyValueIds","in":"query","description":"Comma-separated tag value IDs (see `/data-products/tag-associations/distinct`).","schema":{"type":"string"},"example":"56351"},{"name":"reliabilityScoreStart","in":"query","description":"Inclusive lower bound, 0-100.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"reliabilityScoreEnd","in":"query","description":"Inclusive upper bound, 0-100.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"termIds","in":"query","description":"Comma-separated glossary term IDs; returns products linked to any of them.","schema":{"type":"string"}},{"name":"ids","in":"query","description":"Comma-separated data product IDs.","schema":{"type":"string"},"example":"166,232"},{"name":"cf","in":"query","description":"Custom-field filter, repeatable: `<fieldName>:<operator>:<value>`.\nThe operator is empty for equals. Use `gt`/`lt` for NUMBER and `gte`/`lte` for DATE/DATE_TIME.\nExamples: `region::EMEA`, `rowCount:gt:1000`, `certifiedOn:gte:2026-01-01`.","style":"form","explode":true,"schema":{"type":"array","items":{"type":"string"}}},{"name":"listing","in":"query","description":"Manage-flow scope (products the caller can manage).","schema":{"type":"string","enum":["userOnly"]}},{"$ref":"#/components/parameters/Marketplace"},{"name":"includePermissions","in":"query","description":"Adds `permissions[]` to each item.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Page of data products","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataProductList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"406":{"$ref":"#/components/responses/NoCredentials"}}},"post":{"tags":["Data Products"],"operationId":"createDataProduct","summary":"Create a data product","description":"Creates a new Data Product. New Data Products are created in Draft status and are not visible in the Marketplace until published. The product name must be unique within the tenant.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDataProductRequest"},"example":{"name":"zz-api-doc-test","owner":"john.doe@acceldata.io","description":"Throwaway product for API documentation capture - safe to delete","businessJustification":"API doc capture","ruleType":"DATA_QUALITY","assetIds":[32611173],"customFields":{}}}}},"responses":{"200":{"description":"Created (the server returns 200, not 201)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataProduct"},"example":{"id":"1948","name":"zz-api-doc-test","description":"Throwaway product for API documentation capture - safe to delete","businessJustification":"API doc capture","domainId":"7129","ruleType":"DATA_QUALITY","createdBy":"john.doe@acceldata.io","createdAt":"2026-09-30T08:45:38.848Z","updatedBy":"john.doe@acceldata.io","updatedAt":"2026-09-30T08:45:38.848Z","owner":"john.doe@acceldata.io","status":"DRAFT","reliabilityScore":null,"rating":null,"customFields":{},"tagsCount":"0"}}}},"400":{"description":"Unknown asset IDs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"code":3,"grpc-code":"INVALID_ARGUMENT","message":"Invalid asset ids: [999999999999]"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"406":{"$ref":"#/components/responses/NoCredentials"},"409":{"description":"Duplicate name","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"code":6,"grpc-code":"ALREADY_EXISTS","message":"Data product with name 'zz-api-doc-test' already exists"}}}},"500":{"description":"Validation failure (blank name, unknown ruleType). Returned as INTERNAL by the server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"blankName":{"value":{"code":13,"grpc-code":"INTERNAL","message":"Data product name cannot be blank"}},"badRuleType":{"value":{"code":13,"grpc-code":"INTERNAL","message":"Invalid rule type: NOT_A_RULE. Valid values: DATA_QUALITY, RECONCILIATION, EQUALITY, DATA_DRIFT, SCHEMA_DRIFT, DATA_CADENCE, PROFILE_ANOMALY, AUTO_ANOMALY"}}}}}}}}},"/catalog/api/v1/data-products/{id}":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Data Products"],"operationId":"getDataProduct","summary":"Get a data product","parameters":[{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"The data product","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataProduct"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"description":"Returns the details of a single Data Product, including its description, business justification, rule types, owner, status, and reliability score."},"patch":{"tags":["Data Products"],"operationId":"updateDataProduct","summary":"Update a data product (partial). Also used to publish and unpublish.","description":"Updates one or more fields of a Data Product. Include only the fields you want to change; an empty request body is a no-op.\n\n- Publish: set status to PUBLISHED. Publishing takes effect immediately and the Data Product appears in the Marketplace right away.\n- Unpublish: set status to DRAFT.\n- assetIds replaces the entire set of member assets; removeAssetIds removes only the specified assets and keeps the rest.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDataProductRequest"},"examples":{"publish":{"value":{"status":"PUBLISHED"}},"unpublish":{"value":{"status":"DRAFT"}},"editInfo":{"value":{"description":"Updated via API doc capture","ruleType":"DATA_QUALITY,RECONCILIATION,EQUALITY"}},"replaceAssets":{"value":{"assetIds":[32611173,32612805]}},"removeAssets":{"value":{"removeAssetIds":[32612805]}}}}}},"responses":{"200":{"description":"The updated data product","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataProduct"}}}},"400":{"description":"Unknown asset IDs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"description":"Validation failure (e.g. unknown status). Returned as INTERNAL by the server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"code":13,"grpc-code":"INTERNAL","message":"Invalid status: FOO. Valid values: DRAFT, PUBLISHED"}}}}}}},"/catalog/api/v1/data-products/delete":{"post":{"tags":["Data Products"],"operationId":"deleteDataProducts","summary":"Delete one or more data products","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"}}}},"example":{"ids":["1948"]}}}},"responses":{"200":{"description":"Delete result (supports partial success via `unauthorizedIds`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"},"example":{"success":true,"deletedIds":["1948"],"message":"1 out of 1 data products deleted","unauthorizedIds":[]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"An ID doesn't exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"code":5,"grpc-code":"NOT_FOUND","message":"Data product with id 1948 not found"}}}}},"description":"Deletes one or more Data Products by ID. If the caller lacks permission to delete some of the specified products, those IDs are returned in unauthorizedIds and are left untouched, while the rest are deleted."}},"/catalog/api/v1/data-products/owners":{"get":{"tags":["Data Products"],"operationId":"listDataProductOwners","summary":"Distinct owners across data products (Owners filter options)","responses":{"200":{"description":"Owners","content":{"application/json":{"schema":{"type":"object","properties":{"owners":{"type":"array","items":{"type":"string","format":"email"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}}},"description":"Returns the distinct list of Data Product owners across the tenant. Use this to populate the Owner filter when searching Data Products."}},"/catalog/api/v1/data-products/{id}/permissions":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"getDataProductPermissions","summary":"Caller's effective permissions on a data product","responses":{"200":{"description":"Permissions","content":{"application/json":{"schema":{"type":"object","properties":{"permissions":{"type":"array","items":{"$ref":"#/components/schemas/PermissionKey"}},"isAdmin":{"type":"boolean"}}}}}}},"description":"Returns the calling user's effective permissions on a Data Product, along with whether the user has administrator access."}},"/catalog/api/v1/data-products/{id}/assets":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"listDataProductAssets","summary":"Assets in a data product","parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/SortBy"},{"name":"name","in":"query","description":"Asset name search","schema":{"type":"string"}},{"name":"tag_key_value_ids","in":"query","description":"Comma-separated tag value IDs","schema":{"type":"string"}},{"name":"assembly_ids","in":"query","description":"Comma-separated data source IDs","schema":{"type":"string"}},{"name":"source_type_ids","in":"query","description":"Comma-separated source type IDs","schema":{"type":"string"}},{"name":"asset_type_ids","in":"query","description":"Comma-separated asset type IDs","schema":{"type":"string"}},{"name":"profiled","in":"query","schema":{"type":"boolean"}},{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Page of assets","content":{"application/json":{"schema":{"type":"object","properties":{"dataProductId":{"type":"string"},"assets":{"type":"array","items":{"$ref":"#/components/schemas/CatalogAsset"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}}},"description":"Returns the data assets that belong to a Data Product, corresponding to the Assets tab on the Data Product detail page. Supports filtering by asset name, tags, data source, source type, asset type, and profiling status."}},"/catalog/api/v1/data-products/{id}/scores":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"getDataProductScores","summary":"Reliability and dimension scores","parameters":[{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Scores","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scores"}}}}},"description":"Returns the current Reliability Score and per-dimension scores (Data Quality, Reconciliation, Data Freshness, Data Drift, Schema Drift) for a Data Product, aggregated across its member assets."}},"/catalog/api/v1/data-products/{id}/refresh-scores":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"refreshDataProductScores","summary":"Recompute scores (side effect despite GET)","responses":{"200":{"description":"Freshly computed scores","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scores"}}}}},"description":"Recalculates and returns the Reliability Score and dimension scores for a Data Product on demand, instead of waiting for the next scheduled calculation."}},"/catalog/api/v1/data-products/{id}/governance":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"getDataProductGovernance","summary":"Quality SLA - policy counts per asset for governed rule types","parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/SortBy"},{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Governance summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Governance"}}}}},"description":"Returns Quality SLA coverage for a Data Product — the number of policies of each governed type applied to each member asset — corresponding to the Quality SLA tab on the Data Product detail page."}},"/catalog/api/v1/data-products/{id}/policies":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"listDataProductPolicies","summary":"Data-reliability policies on the product's assets","parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/SortBy"},{"name":"name","in":"query","description":"Policy name search","schema":{"type":"string"}},{"name":"updatedAfter","in":"query","description":"Epoch milliseconds","schema":{"type":"integer","format":"int64"}},{"name":"updatedBefore","in":"query","description":"Epoch milliseconds","schema":{"type":"integer","format":"int64"}},{"name":"ruleStatus","in":"query","description":"Comma-separated, e.g. ENABLED,ACTIVE","schema":{"type":"string"}},{"name":"resultStatus","in":"query","description":"Comma-separated last-result statuses","schema":{"type":"string"}},{"name":"assemblyIds","in":"query","schema":{"type":"string"}},{"name":"tag_key_value_ids","in":"query","schema":{"type":"string"}},{"name":"rule_set_ids","in":"query","schema":{"type":"string"}},{"name":"groupType","in":"query","schema":{"type":"string"}},{"name":"createdBy","in":"query","schema":{"type":"string"}},{"name":"updatedBy","in":"query","schema":{"type":"string"}},{"name":"watchedAsset","in":"query","description":"\"My assets\" toggle; empty = all","schema":{"type":"string"}},{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Policies (standard ADOC rule objects)","content":{"application/json":{"schema":{"type":"object","properties":{"dataProductId":{"type":"string"},"policies":{"type":"array","items":{"type":"object","properties":{"rule":{"type":"object","additionalProperties":true,"description":"Standard ADOC rule object (id, name, description, type, enabled, schedule, thresholdLevel, backingAssets, ...)"}}}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}}},"description":"Returns the data reliability policies applied to a Data Product's member assets, corresponding to the Policies tab on the Data Product detail page. Supports filtering by policy name, status, rule set, data source, tag, policy group, execution result, and update time."}},"/catalog/api/v2/data-products/{id}/lineage":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"getDataProductLineage","summary":"Lineage graph (v2)","parameters":[{"name":"sublevellineage","in":"query","description":"Include column / sub-asset lineage","schema":{"type":"boolean"}},{"name":"assetIds","in":"query","description":"Comma-separated asset IDs to restrict the graph","schema":{"type":"string"}},{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Graph","content":{"application/json":{"schema":{"type":"object","properties":{"dataProductId":{"type":"string"},"graph":{"type":"object","properties":{"nodes":{"type":"array","items":{"type":"object","additionalProperties":true}},"edges":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"description":"Returns the upstream and downstream lineage graph for a Data Product's member assets, including connected tables, pipelines, and reports, corresponding to the Lineage tab on the Data Product detail page. Set sublevellineage to true to include column-level lineage."}},"/catalog/api/v1/data-products/{id}/documentation":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"getDataProductDocumentation","summary":"Get rich-text documentation","parameters":[{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Documentation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Documentation"}}}}},"description":"Returns the freeform markdown documentation authored for a Data Product, corresponding to the Documentation tab on the Data Product detail page."},"put":{"tags":["Detail"],"operationId":"updateDataProductDocumentation","summary":"Save rich-text documentation","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["documentation"],"properties":{"documentation":{"type":"string","description":"JSON-encoded array of Editor.js blocks"}}},"example":{"documentation":"[{\"id\":\"zzdoc00001\",\"type\":\"paragraph\",\"data\":{\"text\":\"Throwaway documentation for API capture.\"}}]"}}}},"responses":{"200":{"description":"Saved documentation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Documentation"}}}}},"description":"Saves the freeform markdown documentation for a Data Product. Changes take effect immediately and are visible to anyone with access to the published Data Product; there is no separate publish step for documentation."}},"/catalog/api/v1/data-products/{id}/comments":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Reviews"],"operationId":"listDataProductComments","summary":"Reviews and threaded replies","parameters":[{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Comments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentList"}}}}},"description":"Returns the reviews and threaded replies submitted for a Data Product, corresponding to the Reviews tab on the Data Product detail page."},"post":{"tags":["Reviews"],"operationId":"createDataProductComment","summary":"Add a review (with rating) or a reply","description":"Submits a review or a reply on a Data Product.\n\n- To submit a top-level review, set parent_type to data_product and include a rating from 1 to 5.\n- To reply to an existing review, set parent_type to comment and include parent_id.\n\nEach user can submit only one top-level review per Data Product; submitting again updates the existing review (see Edit your review).","parameters":[{"$ref":"#/components/parameters/Marketplace"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentWrite"},"examples":{"review":{"value":{"comment":"Reliable and well documented","parent_type":"data_product","rating":5}},"reply":{"value":{"comment":"For which use case?","parent_type":"comment","parent_id":1}}}}}},"responses":{"200":{"description":"Created"}}}},"/catalog/api/v1/data-products/{id}/comments/{commentId}":{"parameters":[{"$ref":"#/components/parameters/ProductId"},{"name":"commentId","in":"path","required":true,"schema":{"type":"string"},"description":"Unique identifier of the review or reply."}],"put":{"tags":["Reviews"],"operationId":"updateDataProductComment","summary":"Edit your review","parameters":[{"$ref":"#/components/parameters/Marketplace"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentWrite"},"example":{"comment":"Updated review","parent_type":"data_product","rating":4}}}},"responses":{"200":{"description":"Updated"}},"description":"Updates the caller's own existing review or reply on a Data Product."}},"/catalog/api/v1/data-products/{id}/audit":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Detail"],"operationId":"listDataProductAudit","summary":"Version history","parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/SortBy"},{"$ref":"#/components/parameters/Marketplace"}],"responses":{"200":{"description":"Audit entries, newest first by default","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditList"}}}}},"description":"Returns the version history of a Data Product, corresponding to the Versions tab on the Data Product detail page. Each entry records which fields changed, who made the change, and when, in newest-first order by default."}},"/catalog/api/v1/data-products/{id}/group-role-mappings":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Sharing"],"operationId":"listDataProductGroupRoleMappings","summary":"User groups the product is shared with","responses":{"200":{"description":"Mappings","content":{"application/json":{"schema":{"type":"object","properties":{"groupRoleMappings":{"type":"array","items":{"$ref":"#/components/schemas/GroupRoleMapping"}}}}}}}},"description":"Returns the user groups a Data Product has been shared with, along with the role each group has been granted."}},"/catalog/api/v1/data-products/{id}/share":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"put":{"tags":["Sharing"],"operationId":"shareDataProduct","summary":"Grant and revoke user-group roles on a data product","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequest"},"example":{"groupRoleMappings":[{"groupId":"08b885fd-afe3-49eb-96e4-42894064447c","roleId":"517","roleName":"resource_viewer"}],"removeUserGroupRoleMappings":["7657"]}}}},"responses":{"200":{"description":"Shared"}},"description":"Grants or revokes user group access to a Data Product. Use groupRoleMappings to add or update group role grants, and removeUserGroupRoleMappings to revoke existing grants by their mapping ID."}},"/catalog/api/v1/data-products/{id}/tag-associations":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Tags"],"operationId":"getDataProductTags","summary":"Tags on a data product","responses":{"200":{"description":"Tags","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagList"}}}}},"description":"Returns the tags currently associated with a Data Product."},"put":{"tags":["Tags"],"operationId":"setDataProductTags","summary":"Replace the product's tag set ([] removes all)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tagKeyValueIds"],"properties":{"tagKeyValueIds":{"type":"array","items":{"type":"integer","format":"int64"}}}},"example":{"tagKeyValueIds":[56351]}}}},"responses":{"200":{"description":"Resulting tag set","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagList"}}}}},"description":"Replaces the full set of tags associated with a Data Product. Pass an empty array to remove all tags."}},"/catalog/api/v1/data-products/tag-associations/bulk":{"post":{"tags":["Tags"],"operationId":"bulkAddDataProductTags","summary":"Add tags to multiple data products (additive)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids","tagKeyValueIds"],"properties":{"ids":{"type":"array","items":{"type":"integer","format":"int64"}},"tagKeyValueIds":{"type":"array","items":{"type":"integer","format":"int64"}}}},"example":{"ids":[1948],"tagKeyValueIds":[56351]}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"array","items":{"$ref":"#/components/schemas/TagValue"}},"errors":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"description":"Adds one or more tags to multiple Data Products at once. This is additive — existing tags on the specified products are kept."}},"/catalog/api/v1/data-products/tag-associations/distinct":{"get":{"tags":["Tags"],"operationId":"listDistinctDataProductTags","summary":"Distinct tags used on any data product (Tags filter options)","responses":{"200":{"description":"Tags in use","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TagValue"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}}},"description":"Returns the distinct set of tags currently in use across all Data Products. Use this to populate the Tags filter when searching Data Products."}},"/catalog/api/v1/entities/DATA_PRODUCT/{id}/term-associations":{"parameters":[{"$ref":"#/components/parameters/ProductId"}],"get":{"tags":["Glossary Terms"],"operationId":"listDataProductTermAssociations","summary":"Glossary terms linked to a data product","parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Size"},{"$ref":"#/components/parameters/SortBy"}],"responses":{"200":{"description":"Term associations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TermAssociationList"}}}}},"description":"Returns the business glossary terms linked to a Data Product."},"post":{"tags":["Glossary Terms"],"operationId":"updateDataProductTermAssociations","summary":"Link and/or unlink glossary terms","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"termIds":{"type":"array","items":{"type":"integer","format":"int64"}},"deletedAssociationIds":{"type":"array","items":{"type":"string"}}}},"examples":{"link":{"value":{"termIds":[149,150],"deletedAssociationIds":[]}},"unlink":{"value":{"termIds":[],"deletedAssociationIds":["199"]}}}}}},"responses":{"200":{"description":"Updated"}},"description":"Links and unlinks business glossary terms on a Data Product. Use termIds to add new term links, and deletedAssociationIds to remove existing ones."}},"/catalog/api/v1/data-product/custom-fields":{"get":{"tags":["Custom Fields"],"operationId":"listCustomFields","summary":"List custom field definitions (note singular `data-product`)","parameters":[{"$ref":"#/components/parameters/SortBy"},{"name":"name","in":"query","description":"Search by field name","schema":{"type":"string"}}],"responses":{"200":{"description":"Custom fields","content":{"application/json":{"schema":{"type":"object","properties":{"customFields":{"type":"array","items":{"$ref":"#/components/schemas/CustomField"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}}},"description":"Returns the custom field definitions configured for Data Products in the tenant. Custom fields extend the standard Data Product form with administrator-defined metadata."},"post":{"tags":["Custom Fields"],"operationId":"createCustomField","summary":"Create a custom field definition","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldCreate"},"example":{"name":"region","label":"Region","description":"Business region","dataType":"PICKLIST","allowedValues":["EMEA","AMER","APAC"],"required":false,"defaultValue":"EMEA","showInMarketplace":true,"filterable":true}}}},"responses":{"200":{"description":"Created field","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomField"}}}}},"description":"Creates a new custom field definition for Data Products. allowedValues applies only to PICKLIST and MULTI_SELECT fields."}},"/catalog/api/v1/data-product/custom-fields/{fieldId}":{"parameters":[{"name":"fieldId","in":"path","required":true,"schema":{"type":"string"},"description":"Unique identifier of the custom field."}],"patch":{"tags":["Custom Fields"],"operationId":"updateCustomField","summary":"Update a custom field (name and dataType are immutable)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldUpdate"}}}},"responses":{"200":{"description":"Updated field","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomField"}}}}},"description":"Updates a custom field definition. The field's name and dataType cannot be changed after creation; include only the properties you want to change."},"delete":{"tags":["Custom Fields"],"operationId":"deleteCustomField","summary":"Delete a custom field","responses":{"200":{"description":"Deleted"}},"description":"Deletes a custom field definition. Existing Data Products lose the corresponding custom field value."}},"/catalog/api/v1/data-product/custom-fields/reorder":{"put":{"tags":["Custom Fields"],"operationId":"reorderCustomFields","summary":"Set display order of custom fields","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["orderedIds"],"properties":{"orderedIds":{"type":"array","items":{"type":"string"}}}},"example":{"orderedIds":["12","7","9"]}}}},"responses":{"200":{"description":"Reordered"}},"description":"Sets the display order of custom fields on the Data Product form."}}},"components":{"securitySchemes":{"accessKey":{"type":"apiKey","in":"header","name":"accessKey","description":"ADOC API access key (use together with secretKey)"},"secretKey":{"type":"apiKey","in":"header","name":"secretKey","description":"ADOC API secret key"},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"OIDC access token for realm `<tenant>` (what the web UI sends; short-lived)"}},"parameters":{"ProductId":{"name":"id","in":"path","required":true,"description":"Data product ID","schema":{"type":"string"},"example":"166"},"Page":{"name":"page","in":"query","description":"0-based page index","schema":{"type":"integer","minimum":0,"default":0}},"Size":{"name":"size","in":"query","description":"Page size","schema":{"type":"integer","minimum":1,"default":20}},"SortBy":{"name":"sortBy","in":"query","description":"`<field>:ASC|DESC`. Unknown fields are ignored.","schema":{"type":"string"},"example":"updatedAt:DESC"},"Marketplace":{"name":"marketplace","in":"query","description":"Consumer (Marketplace) context","schema":{"type":"boolean"}}},"responses":{"NotFound":{"description":"Unknown ID, or the caller has no access (indistinguishable)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"code":5,"grpc-code":"NOT_FOUND","message":"Either the Data product with id 99999999 not exists or you don't have access to this data product."}}}},"Unauthorized":{"description":"Invalid API key (JSON) or expired bearer token (text/plain)","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"statusCode":{"type":"integer"}}}}}},"example":{"errors":[{"message":"Either the api key doesn't exist or the provided input is wrong for access key : dummy","statusCode":401}]}},"text/plain":{"schema":{"type":"string"},"example":"ERROR : JWT expired at 2026-09-30T08:47:46Z. Current time: 2026-09-30T08:47:46Z, a difference of 395 milliseconds.  Allowed clock skew: 0 milliseconds."}}},"NoCredentials":{"description":"No credentials supplied","content":{"text/plain":{"schema":{"type":"string"},"example":"request should have bearer token headers or internal headers. no token/api keys/ad ingest key /internal headers are found."}}}},"schemas":{"Error":{"type":"object","description":"gRPC-gateway style error","properties":{"code":{"type":"integer","description":"gRPC status code"},"grpc-code":{"type":"string","example":"NOT_FOUND"},"message":{"type":"string"}}},"PageMeta":{"type":"object","properties":{"count":{"type":"integer","description":"Total matching records"},"page":{"type":"integer"},"size":{"type":"integer"}}},"Status":{"type":"string","enum":["DRAFT","PUBLISHED"]},"RuleType":{"type":"string","description":"Comma-joined subset of: DATA_QUALITY, RECONCILIATION, EQUALITY, DATA_DRIFT, SCHEMA_DRIFT,\nDATA_CADENCE, PROFILE_ANOMALY, AUTO_ANOMALY. The UI's Reconciliation checkbox sends\n`RECONCILIATION,EQUALITY`. An empty string means no governance.","example":"DATA_QUALITY,RECONCILIATION,EQUALITY"},"PermissionKey":{"type":"string","enum":["view:dataProducts","modify:dataProducts","delete:dataProducts"]},"CustomFieldValues":{"type":"object","description":"Map of custom field name to value. Value type depends on the field's dataType:\nTEXT/EMAIL/URL/PICKLIST → string, NUMBER → number, CHECKBOX → boolean, MULTI_SELECT → string[],\nDATE → \"YYYY-MM-DD\", DATE_TIME → ISO-8601 UTC.","additionalProperties":{}},"DataProduct":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"businessJustification":{"type":"string"},"domainId":{"type":"string","description":"Server-assigned resource domain backing access control"},"ruleType":{"type":"string","nullable":true,"description":"Comma-joined RuleType values (see RuleType schema); null when no governance is set","example":"DATA_QUALITY,DATA_CADENCE"},"owner":{"type":"string","format":"email"},"status":{"$ref":"#/components/schemas/Status"},"reliabilityScore":{"type":"number","nullable":true,"minimum":0,"maximum":100},"rating":{"type":"number","nullable":true},"tagsCount":{"type":"string","description":"Number of tags (serialized as a string)"},"customFields":{"$ref":"#/components/schemas/CustomFieldValues"},"permissions":{"type":"array","description":"Present only when listing with includePermissions=true","items":{"$ref":"#/components/schemas/PermissionKey"}},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedBy":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}}},"DataProductList":{"type":"object","properties":{"dataProducts":{"type":"array","items":{"$ref":"#/components/schemas/DataProduct"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"CreateDataProductRequest":{"type":"object","required":["name","owner"],"properties":{"name":{"type":"string","description":"Non-blank; unique per tenant"},"owner":{"type":"string","format":"email"},"description":{"type":"string","default":""},"businessJustification":{"type":"string","default":""},"ruleType":{"$ref":"#/components/schemas/RuleType"},"assetIds":{"type":"array","description":"Catalog asset IDs; all must exist","items":{"type":"integer","format":"int64"}},"customFields":{"$ref":"#/components/schemas/CustomFieldValues"}}},"UpdateDataProductRequest":{"type":"object","description":"Partial update - include only the fields that change.","properties":{"name":{"type":"string"},"owner":{"type":"string","format":"email"},"description":{"type":"string"},"businessJustification":{"type":"string"},"ruleType":{"$ref":"#/components/schemas/RuleType"},"assetIds":{"type":"array","description":"Replaces the entire asset set","items":{"type":"integer","format":"int64"}},"removeAssetIds":{"type":"array","description":"Assets to remove; others are kept","items":{"type":"integer","format":"int64"}},"customFields":{"allOf":[{"$ref":"#/components/schemas/CustomFieldValues"}],"description":"Changed keys only; null clears a value"},"status":{"$ref":"#/components/schemas/Status"}}},"DeleteResponse":{"type":"object","properties":{"success":{"type":"boolean"},"deletedIds":{"type":"array","items":{"type":"string"}},"message":{"type":"string"},"unauthorizedIds":{"type":"array","items":{"type":"string"}}}},"TagValue":{"type":"object","properties":{"keyValueId":{"type":"string"},"keyId":{"type":"integer"},"keyName":{"type":"string"},"valueName":{"type":"string"},"keyType":{"type":"string","example":"USER"},"valueStatus":{"type":"string","example":"ACTIVE"}}},"TagList":{"type":"object","properties":{"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagValue"}}}},"DimensionScore":{"type":"object","properties":{"dimension":{"type":"string","example":"COMPLETENESS"},"score":{"type":"number"},"successCount":{"type":"string"},"failureCount":{"type":"string"},"warningCount":{"type":"string"}}},"Scores":{"type":"object","properties":{"dataProductId":{"type":"string"},"reliabilityScore":{"type":"number","nullable":true},"dataQualityScore":{"type":"number","nullable":true},"reconciliationScore":{"type":"number","nullable":true},"dataCadenceScore":{"type":"number","nullable":true},"profileAnomalyScore":{"type":"number","nullable":true},"dataDriftScore":{"type":"number","nullable":true},"schemaDriftScore":{"type":"number","nullable":true},"schemaDriftSuccessful":{"type":"boolean","nullable":true},"profileAnomalySuccessful":{"type":"boolean","nullable":true},"dataCadenceSuccessful":{"type":"boolean","nullable":true},"dataDriftSuccessful":{"type":"boolean","nullable":true},"dimensionScores":{"type":"array","items":{"$ref":"#/components/schemas/DimensionScore"}},"assetCount":{"type":"integer"},"version":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"CatalogAsset":{"type":"object","additionalProperties":true,"properties":{"assetId":{"type":"string","description":"String in product-asset responses; number in asset-picker responses"},"assetUid":{"type":"string"},"name":{"type":"string"},"sourceType":{"type":"string","example":"SNOWFLAKE"},"assetType":{"type":"string","example":"TABLE"},"assemblyId":{"type":"string"},"assemblyName":{"type":"string"},"description":{"type":"string"},"qualityScore":{"type":"number","nullable":true},"policyScore":{"type":"number","nullable":true},"scoringStrategy":{"type":"string","example":"POLICY_BASED"},"dataQualityPolicyCount":{"type":"integer","nullable":true},"reconciliationPolicyCount":{"type":"integer","nullable":true},"dataCadencePolicyCount":{"type":"integer","nullable":true},"schemaDriftPolicyCount":{"type":"integer","nullable":true},"dataDriftPolicyCount":{"type":"integer","nullable":true},"profileAnomalyPolicyCount":{"type":"integer","nullable":true},"openAlertCount":{"type":"integer"},"openAlertIds":{"type":"array","items":{"type":"integer"}},"isWatched":{"type":"boolean"},"isProfiled":{"type":"boolean"},"totalRows":{"type":"integer","nullable":true}}},"Governance":{"type":"object","properties":{"dataProductId":{"type":"string"},"ruleType":{"$ref":"#/components/schemas/RuleType"},"assets":{"type":"array","items":{"type":"object","properties":{"assetId":{"type":"string"},"assetName":{"type":"string"},"assetUid":{"type":"string"},"sourceType":{"type":"string"},"assetType":{"type":"string"},"dataQualityPolicyCount":{"type":"integer","nullable":true},"reconciliationPolicyCount":{"type":"integer","nullable":true},"dataCadencePolicyCount":{"type":"integer","nullable":true},"schemaDriftPolicyCount":{"type":"integer","nullable":true},"dataDriftPolicyCount":{"type":"integer","nullable":true},"profileAnomalyPolicyCount":{"type":"integer","nullable":true}}}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"Documentation":{"type":"object","properties":{"dataProductId":{"type":"string"},"documentation":{"type":"string","nullable":true,"description":"JSON-encoded array of Editor.js blocks"},"updatedBy":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time","nullable":true}}},"Comment":{"type":"object","properties":{"id":{"type":"string"},"dataProductId":{"type":"string"},"comment":{"type":"string"},"parentId":{"type":"integer","nullable":true},"parentType":{"type":"string","enum":["data_product","comment"]},"rating":{"type":"integer","nullable":true,"minimum":1,"maximum":5},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time","nullable":true},"replies":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}},"CommentList":{"type":"object","properties":{"dataProductId":{"type":"string"},"comments":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"userComment":{"type":"object","nullable":true,"description":"The caller's own top-level review","properties":{"id":{"type":"integer"},"rating":{"type":"integer"},"comment":{"type":"string"}}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"CommentWrite":{"type":"object","required":["comment","parent_type"],"properties":{"comment":{"type":"string"},"parent_type":{"type":"string","enum":["data_product","comment"]},"parent_id":{"type":"integer","description":"Required when parent_type = comment"},"rating":{"type":"integer","minimum":1,"maximum":5,"description":"Top-level reviews only"}}},"AuditChange":{"type":"object","properties":{"field":{"type":"string","description":"Observed values - status, description, quality_SLA, assets, documentation, tags"},"oldValue":{},"newValue":{}}},"AuditList":{"type":"object","properties":{"dataProductId":{"type":"string"},"audits":{"type":"array","items":{"type":"object","properties":{"version":{"type":"integer"},"updatedBy":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"changes":{"type":"array","items":{"$ref":"#/components/schemas/AuditChange"}}}}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"GroupRoleMapping":{"type":"object","properties":{"id":{"type":"string"},"groupId":{"type":"string"},"roleId":{"type":"string"},"roleName":{"type":"string","example":"resource_viewer"}}},"ShareRequest":{"type":"object","properties":{"groupRoleMappings":{"type":"array","description":"Grants to add","items":{"type":"object","required":["groupId","roleId"],"properties":{"groupId":{"type":"string"},"roleId":{"type":"string"},"roleName":{"type":"string"}}}},"removeUserGroupRoleMappings":{"type":"array","description":"Mapping IDs (from group-role-mappings) to revoke","items":{"type":"string"}}}},"TermAssociationList":{"type":"object","properties":{"entityType":{"type":"string","example":"DATA_PRODUCT"},"entityId":{"type":"string"},"associations":{"type":"array","items":{"type":"object","properties":{"association":{"type":"object","properties":{"id":{"type":"string"},"termId":{"type":"string"},"associatedItemId":{"type":"string"},"associatedItemType":{"type":"string"},"createdBy":{"type":"string"},"updatedBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"term":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"definition":{"type":"string"},"status":{"type":"string"},"owner":{"type":"string"},"categoryId":{"type":"string"},"categoryName":{"type":"string"},"glossaryId":{"type":"string"},"glossaryName":{"type":"string"}}}}}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},"CustomFieldDataType":{"type":"string","enum":["TEXT","NUMBER","DATE","DATE_TIME","PICKLIST","MULTI_SELECT","CHECKBOX","EMAIL","URL"]},"CustomField":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"dataType":{"$ref":"#/components/schemas/CustomFieldDataType"},"allowedValues":{"type":"array","items":{"type":"string"}},"required":{"type":"boolean"},"defaultValue":{"description":"Typed per dataType; null when unset"},"showInMarketplace":{"type":"boolean"},"filterable":{"type":"boolean"},"displayOrder":{"type":"integer"}}},"CustomFieldCreate":{"type":"object","required":["name","label","dataType"],"properties":{"name":{"type":"string","pattern":"^[a-zA-Z0-9_-]*$"},"label":{"type":"string"},"description":{"type":"string"},"dataType":{"$ref":"#/components/schemas/CustomFieldDataType"},"allowedValues":{"type":"array","description":"PICKLIST / MULTI_SELECT only","items":{"type":"string"}},"required":{"type":"boolean"},"defaultValue":{"description":"Typed per dataType"},"showInMarketplace":{"type":"boolean"},"filterable":{"type":"boolean","description":"Always false for TEXT"}}},"CustomFieldUpdate":{"type":"object","description":"Changed properties only; name and dataType are immutable","properties":{"label":{"type":"string"},"description":{"type":"string"},"required":{"type":"boolean"},"showInMarketplace":{"type":"boolean"},"filterable":{"type":"boolean"},"allowedValues":{"type":"array","items":{"type":"string"}},"defaultValue":{"description":"Typed per dataType; null clears the default"}}}}}}