openapi: 3.0.1
info:
title: Catalog Management agreement product API
description: "Product Catalog API is one of Catalog Management API Family. Product Catalog API goal is to provide a catalog of products. \n### Operations\nProduct Catalog API performs the following operations on the resources :\n- Retrieve an entity or a collection of entities depending on filter criteria\n- Partial update of an entity (including updating rules)\n- Create an entity (including default values and creation rules)\n- Delete an entity\n- Manage notification of events"
version: 5.0.0
servers:
- url: https://serverRoot/productCatalogManagement/v5/
tags:
- name: product
description: Operations for Product Resource
paths:
/product:
get:
tags:
- product
summary: TM Forum List or Find Product Objects
description: List or find Product objects
operationId: listProduct
parameters:
- $ref: '#/components/parameters/Fields'
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Limit'
responses:
'200':
$ref: '#/components/responses/200ProductArray'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'405':
$ref: '#/components/responses/405'
'500':
$ref: '#/components/responses/500'
'501':
$ref: '#/components/responses/501'
'503':
$ref: '#/components/responses/503'
post:
tags:
- product
summary: TM Forum Creates a Product
description: This operation creates a Product entity.
operationId: createProduct
parameters:
- $ref: '#/components/parameters/Fields'
requestBody:
$ref: '#/components/requestBodies/Product_FVO'
responses:
'201':
$ref: '#/components/responses/201Product'
'202':
description: Accepted
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'405':
$ref: '#/components/responses/405'
'409':
$ref: '#/components/responses/409'
'500':
$ref: '#/components/responses/500'
'501':
$ref: '#/components/responses/501'
'503':
$ref: '#/components/responses/503'
/product/{id}:
get:
tags:
- product
summary: TM Forum Retrieves a Product by ID
description: This operation retrieves a Product entity. Attribute selection enabled for all first level attributes.
operationId: retrieveProduct
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/Fields'
responses:
'200':
$ref: '#/components/responses/200Product_Get'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'405':
$ref: '#/components/responses/405'
'500':
$ref: '#/components/responses/500'
'501':
$ref: '#/components/responses/501'
'503':
$ref: '#/components/responses/503'
delete:
tags:
- product
summary: TM Forum Deletes a Product
description: This operation deletes a Product entity.
operationId: deleteProduct
parameters:
- $ref: '#/components/parameters/Id'
responses:
'202':
$ref: '#/components/responses/202'
'204':
$ref: '#/components/responses/204'
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'405':
$ref: '#/components/responses/405'
'409':
$ref: '#/components/responses/409'
'500':
$ref: '#/components/responses/500'
'501':
$ref: '#/components/responses/501'
'503':
$ref: '#/components/responses/503'
patch:
tags:
- product
summary: TM Forum Updates Partially a Product
description: This operation updates partially a Product entity.
operationId: patchProduct
parameters:
- $ref: '#/components/parameters/Id'
- $ref: '#/components/parameters/Fields'
requestBody:
$ref: '#/components/requestBodies/Product_MVO'
responses:
'200':
$ref: '#/components/responses/200Product_Patch'
'202':
description: Accepted
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'405':
$ref: '#/components/responses/405'
'409':
$ref: '#/components/responses/409'
'500':
$ref: '#/components/responses/500'
'501':
$ref: '#/components/responses/501'
'503':
$ref: '#/components/responses/503'
components:
schemas:
Expression_MVO:
allOf:
- $ref: '#/components/schemas/Extensible'
- type: object
description: Expression is the ontology-encoded form of the Intent
properties:
expressionLanguage:
$ref: '#/components/schemas/ExpressionLanguageEnum'
iri:
type: string
description: Internationalized Resource Identifier of the intent Expression
expressionValue:
type: string
description: expression value is the ontology-encoded form of the Intent such as RDF-XML, Turtle, Json-LD,...
discriminator:
propertyName: '@type'
mapping:
Expression: '#/components/schemas/Expression_MVO'
GeographicLocationRef_FVO:
type: object
allOf:
- $ref: '#/components/schemas/EntityRef_FVO'
discriminator:
propertyName: '@type'
mapping:
GeographicLocationRef: '#/components/schemas/GeographicLocationRef_FVO'
BillingAccountRef_FVO:
allOf:
- $ref: '#/components/schemas/Extensible_FVO'
- $ref: '#/components/schemas/EntityRef_FVO'
- type: object
description: BillingAccount reference. A BillingAccount is a detailed description of a bill structure.
properties:
ratingType:
type: string
description: Indicates whether the account follows a specific payment option such as prepaid or postpaid
discriminator:
propertyName: '@type'
mapping:
BillingAccountRef: '#/components/schemas/BillingAccountRef_FVO'
AgreementRef:
type: object
description: Agreement reference. An agreement represents a contract or arrangement, either written or verbal and sometimes enforceable by law, such as a service level agreement or a customer price agreement. An agreement involves a number of other business entities, such as products, services, and resources and/or their specifications.
allOf:
- $ref: '#/components/schemas/Extensible'
- $ref: '#/components/schemas/EntityRef'
discriminator:
propertyName: '@type'
mapping:
AgreementRef: '#/components/schemas/AgreementRef'
ContactMedium:
allOf:
- $ref: '#/components/schemas/Extensible'
- type: object
description: Indicates the contact medium that could be used to contact the party.
properties:
id:
type: string
description: Identifier for this contact medium.
preferred:
type: boolean
description: If true, indicates that is the preferred contact medium
contactType:
type: string
description: Type of the contact medium to qualifiy it like pro email / personal email. This is not used to define the contact medium used.
validFor:
$ref: '#/components/schemas/TimePeriod'
discriminator:
propertyName: '@type'
mapping:
ContactMedium: '#/components/schemas/ContactMedium'
ProductRef:
type: object
description: A Product reference
allOf:
- $ref: '#/components/schemas/Extensible'
- $ref: '#/components/schemas/EntityRef'
discriminator:
propertyName: '@type'
mapping:
ProductRef: '#/components/schemas/ProductRef'
EntityRef_FVO:
allOf:
- $ref: '#/components/schemas/Extensible_FVO'
- $ref: '#/components/schemas/Addressable_FVO'
- type: object
description: Entity reference schema to be use for all entityRef class.
properties:
id:
type: string
description: The identifier of the referred entity.
href:
type: string
description: The URI of the referred entity.
name:
type: string
description: Name of the referred entity.
'@referredType':
type: string
description: The actual type of the target instance when needed for disambiguation.
required:
- id
StandardIdentifier:
allOf:
- $ref: '#/components/schemas/Entity'
- type: object
description: The corresponding identification of the resource in different standard, regulatory definitions. The standard specification identifier (e.g., ISO 3166-1 Alpha-2) and the corresponding value (e.g., BE) relevant to a particular resource. It is anticipated that multiple standards can provide definitions for a single entity, e.g., a country identifier can be specified in various standards (e.g., "ISO 3166-1 Alpha 2", "ISO 3166-1 Alpha 3", "ISO 3166-1 Numeric")
properties:
format:
type: string
description: Standard/Regulatory definition identifier. e.g., ISO 3166-1
example: ISO 3166-1
value:
type: string
description: The value of the resource in the corresponding standard.e.g., a country code value
example: GB
discriminator:
propertyName: '@type'
mapping:
StandardIdentifier: '#/components/schemas/StandardIdentifier'
PlaceRef:
type: object
description: Place reference.
allOf:
- $ref: '#/components/schemas/Extensible'
- $ref: '#/components/schemas/EntityRef'
discriminator:
propertyName: '@type'
mapping:
PlaceRef: '#/components/schemas/PlaceRef'
Product_FVO:
allOf:
- $ref: '#/components/schemas/Entity_FVO'
- type: object
description: A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s).
properties:
agreementItem:
type: array
items:
$ref: '#/components/schemas/AgreementItemRef_FVO'
billingAccount:
$ref: '#/components/schemas/BillingAccountRef_FVO'
description:
type: string
description: Is the description of the product. It could be copied from the description of the Product Offering.
isBundle:
type: boolean
description: If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.
isCustomerVisible:
type: boolean
description: If true, the product is visible by the customer.
name:
type: string
description: Name of the product. It could be the same as the name of the product offering
orderDate:
type: string
format: date-time
description: Is the date when the product was ordered
productCharacteristic:
type: array
items:
$ref: '#/components/schemas/Characteristic_FVO'
productOffering:
$ref: '#/components/schemas/ProductOfferingRef_FVO'
productOrderItem:
type: array
items:
$ref: '#/components/schemas/RelatedOrderItem_FVO'
product:
type: array
items:
$ref: '#/components/schemas/ProductRefOrValue_FVO'
productPrice:
type: array
items:
$ref: '#/components/schemas/ProductPrice_FVO'
productRelationship:
type: array
items:
$ref: '#/components/schemas/ProductRelationship_FVO'
productSerialNumber:
type: string
description: Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.
productSpecification:
$ref: '#/components/schemas/ProductSpecificationRef_FVO'
productTerm:
type: array
items:
$ref: '#/components/schemas/ProductTerm_FVO'
realizingResource:
type: array
items:
$ref: '#/components/schemas/ResourceRef_FVO'
realizingService:
type: array
items:
$ref: '#/components/schemas/ServiceRef_FVO'
relatedParty:
type: array
items:
$ref: '#/components/schemas/RelatedPartyOrPartyRole_FVO'
place:
type: array
items:
$ref: '#/components/schemas/RelatedPlaceRefOrValue_FVO'
startDate:
type: string
format: date-time
description: Is the date from which the product starts
status:
$ref: '#/components/schemas/ProductStatusType'
terminationDate:
type: string
format: date-time
description: Is the date when the product was terminated
intent:
$ref: '#/components/schemas/IntentRefOrValue_FVO'
discriminator:
propertyName: '@type'
mapping:
Product: '#/components/schemas/Product_FVO'
PartyOrPartyRole_FVO:
type: object
description: ''
oneOf:
- $ref: '#/components/schemas/PartyRef_FVO'
- $ref: '#/components/schemas/PartyRoleRef_FVO'
- $ref: '#/components/schemas/Individual_FVO'
- $ref: '#/components/schemas/Organization_FVO'
- $ref: '#/components/schemas/PartyRole_FVO'
- $ref: '#/components/schemas/Supplier_FVO'
- $ref: '#/components/schemas/BusinessPartner_FVO'
- $ref: '#/components/schemas/Consumer_FVO'
- $ref: '#/components/schemas/Producer_FVO'
discriminator:
propertyName: '@type'
mapping:
PartyRef: '#/components/schemas/PartyRef_FVO'
PartyRoleRef: '#/components/schemas/PartyRoleRef_FVO'
Individual: '#/components/schemas/Individual_FVO'
Organization: '#/components/schemas/Organization_FVO'
PartyRole: '#/components/schemas/PartyRole_FVO'
Supplier: '#/components/schemas/Supplier_FVO'
BusinessPartner: '#/components/schemas/BusinessPartner_FVO'
Consumer: '#/components/schemas/Consumer_FVO'
Producer: '#/components/schemas/Producer_FVO'
GeographicLocationRef_MVO:
type: object
allOf:
- $ref: '#/components/schemas/EntityRef'
discriminator:
propertyName: '@type'
mapping:
GeographicLocationRef: '#/components/schemas/GeographicLocationRef_MVO'
ProductOfferingRef_MVO:
allOf:
- $ref: '#/components/schemas/EntityRef'
- type: object
description: ProductOffering reference. A product offering represents entities that are orderable from the provider of the catalog, this resource includes pricing information.
properties:
version:
type: string
description: Version of the product offering
discriminator:
propertyName: '@type'
mapping:
ProductOfferingRef: '#/components/schemas/ProductOfferingRef_MVO'
Intent_MVO:
allOf:
- $ref: '#/components/schemas/Entity_MVO'
- type: object
description: An Intent instance is the formal description of all expectations including requirements, goals, and constraints given to a technical system
properties:
description:
type: string
description: The description of the intent.
validFor:
$ref: '#/components/schemas/TimePeriod'
isBundle:
type: boolean
description: isBundle determines whether an intent represents a single intent (false), or a bundle of intents(true).
priority:
type: string
description: Can be used by intent owner to prioritize intents in an intent management system
statusChangeDate:
type: string
format: date-time
description: A date time( DateTime). The date that the entity status changed to the current one
context:
type: string
description: A string used to give a context to the intent
version:
type: string
description: A field that identifies the specific version of an instance of an intent.
intentSpecification:
$ref: '#/components/schemas/EntityRef'
intentRelationship:
type: array
items:
$ref: '#/components/schemas/EntityRelationship_MVO'
description: A list of intents related to this intent
characteristic:
type: array
items:
$ref: '#/components/schemas/Characteristic_MVO'
relatedParty:
type: array
items:
$ref: '#/components/schemas/RelatedPartyRefOrPartyRoleRef_MVO'
attachment:
type: array
items:
$ref: '#/components/schemas/AttachmentRefOrValue_MVO'
description: Attachments that may be of relevance to this intent, such as picture, document, media
name:
type: string
description: The name of the intent.
expression:
$ref: '#/components/schemas/Expression_MVO'
creationDate:
type: string
format: date-time
description: Date and time of the creation of this REST resource
lastUpdate:
type: string
format: date-time
description: Date and time of the last update of this REST resource
lifecycleStatus:
type: string
description: Used to indicate the current lifecycle status of this intent
discriminator:
propertyName: '@type'
mapping:
Intent: '#/components/schemas/Intent_MVO'
Supplier_MVO:
type: object
description: 'When business partner is the Supplier '
allOf:
- $ref: '#/components/schemas/PartyRole_MVO'
ProductRefOrValue_MVO:
type: object
description: The polymorphic attributes @type, @schemaLocation & @referredType are related to the Product entity and not the ProductRefOrValue class itself
oneOf:
- $ref: '#/components/schemas/Product_MVO'
- $ref: '#/components/schemas/ProductRef_MVO'
discriminator:
propertyName: '@type'
mapping:
Product: '#/components/schemas/Product_MVO'
ProductRef: '#/components/schemas/ProductRef_MVO'
OrganizationChildRelationship_MVO:
allOf:
- $ref: '#/components/schemas/Extensible'
- type: object
description: Child references of an organization in a structure of organizations.
properties:
relationshipType:
type: string
description: Type of the relationship. Could be juridical, hierarchical, geographical, functional for example.
organization:
$ref: '#/components/schemas/OrganizationRef_MVO'
discriminator:
propertyName: '@type'
mapping:
OrganizationChildRelationship: '#/components/schemas/OrganizationChildRelationship_MVO'
PartyRoleRef_MVO:
allOf:
- $ref: '#/components/schemas/EntityRef'
- type: object
description: Party role reference. A party role represents the part played by a party in a given context.
properties:
partyId:
type: string
description: The identifier of the engaged party that is linked to the PartyRole object.
partyName:
type: string
description: The name of the engaged party that is linked to the PartyRole object.
discriminator:
propertyName: '@type'
mapping:
PartyRoleRef: '#/components/schemas/PartyRoleRef_MVO'
PartyRefOrPartyRoleRef_MVO:
type: object
description: ''
oneOf:
- $ref: '#/components/schemas/PartyRef_MVO'
- $ref: '#/components/schemas/PartyRoleRef_MVO'
discriminator:
propertyName: '@type'
mapping:
PartyRef: '#/components/schemas/PartyRef_MVO'
PartyRoleRef: '#/components/schemas/PartyRoleRef_MVO'
Producer:
type: object
allOf:
- $ref: '#/components/schemas/PartyRole'
ProductRelationship_MVO:
allOf:
- $ref: '#/components/schemas/Extensible'
- $ref: '#/components/schemas/EntityRef'
- type: object
description: Used to describe relationship between product.
properties:
id:
type: string
description: Id of the related product
relationshipType:
type: string
description: Relationship type as relies on, bundles, etc...
discriminator:
propertyName: '@type'
mapping:
ProductRelationship: '#/components/schemas/ProductRelationship_MVO'
ExpressionLanguageEnum:
enum:
- Turtle
- JSON-LD
- RDF-XML
- Other
type: string
description: Possible values for the serialized Expression language of an intent or Intent report
RelatedOrderItem_MVO:
allOf:
- $ref: '#/components/schemas/Extensible'
- type: object
description: It's a Order item that has been executed previously.
properties:
orderItemAction:
$ref: '#/components/schemas/ItemActionType'
orderHref:
type: string
description: Reference of the related entity.
'@referredType':
type: string
description: The actual type of the target instance when needed for disambiguation.
role:
type: string
description: Role played by the Order
orderId:
type: string
description: Unique identifier of a related Order.
orderItemId:
type: string
description: Id of an item of a prduct order
discriminator:
propertyName: '@type'
mapping:
RelatedOrderItem: '#/components/schemas/RelatedOrderItem_MVO'
Attachment:
allOf:
- $ref: '#/components/schemas/Entity'
- type: object
description: Complements the description of an element (for instance a product) through video, pictures...
properties:
name:
type: string
description: The name of the attachment
description:
type: string
description: A narrative text describing the content of the attachment
example: Photograph of the Product
url:
type: string
description: Uniform Resource Locator, is a web page address (a subset of URI)
example: http://host/Content/4aafacbd-11ff-4dc8-b445-305f2215715f
content:
type: string
format: base64
description: The actual contents of the attachment object, if embedded, encoded as base64
size:
$ref: '#/components/schemas/Quantity'
validFor:
$ref: '#/components/schemas/TimePeriod'
attachmentType:
type: string
description: a business characterization of the purpose of the attachment, for example logo, instructionManual, contractCopy
mimeType:
type: string
description: a technical characterization of the attachment content format using IETF Mime Types
discriminator:
propertyName: '@type'
mapping:
Attachment: '#/components/schemas/Attachment'
GeographicSite:
allOf:
- $ref: '#/components/schemas/Place'
- type: object
properties:
code:
type: string
description: 'A code that may be used for some addressing schemes eg: [ANSI T1.253-1999]'
creationDate:
type: string
format: date-time
description: Date and time when the GeographicSite was created
description:
type: string
description: Text describing additional information regarding the site
status:
type: string
description: The condition of the GeographicSite, such as planned, underConstruction, cancelled, active, inactive, former
relatedParty:
type: array
items:
$ref: '#/components/schemas/RelatedPartyOrPartyRole'
externalIdentifier:
type: array
items:
$ref: '#/components/schemas/ExternalIdentifier'
calendar:
type: array
items:
$ref: '#/components/schemas/CalendarPeriod'
place:
type: array
items:
$ref: '#/components/schemas/PlaceRefOrValue'
siteRelationship:
type: array
items:
$ref: '#/components/schemas/GeographicSiteRelationship'
OtherNameOrganization_FVO:
allOf:
- $ref: '#/components/schemas/Extensible_FVO'
- type: object
description: Keeps track of other names, for example the old name of an organization.
properties:
tradingName:
type: string
description: The name that the organization trades under
nameType:
type: string
description: Co. , Inc. , Ltd. , Pty Ltd. , Plc; , Gmbh
name:
type: string
description: Organization name (department name for example)
validFor:
$ref: '#/components/schemas/TimePeriod'
discriminator:
propertyName: '@type'
mapping:
OtherNameOrganization: '#/components/schemas/OtherNameOrganization_FVO'
PlaceRefOrValue:
type: object
description: The polymorphic attributes @type, @schemaLocation & @referredType are related to the Place entity and not the PlaceRefOrValue class itself
oneOf:
- $ref: '#/components/schemas/GeographicLocation'
- $ref: '#/components/schemas/GeographicSite'
- $ref: '#/components/schemas/GeographicAddress'
- $ref: '#/components/schemas/PlaceRef'
discriminator:
propertyName: '@type'
mapping:
GeographicLocation: '#/components/schemas/GeographicLocation'
GeographicSite: '#/components/schemas/GeographicSite'
GeographicAddress: '#/components/schemas/GeographicAddress'
PlaceRef: '#/components/schemas/PlaceRef'
PartyCreditProfile_FVO:
allOf:
- $ref: '#/components/schemas/Entity_FVO'
- type: object
description: An individual might be evaluated for its worthiness and this evaluation might be based on a credit rating given by a credit agency.
properties:
creditAgencyName:
type: string
description: Name of the credit agency giving the score
creditAgencyType:
type: string
description: Type of the credit agency giving the score
ratingReference:
type: string
description: Reference corresponding to the credit rating
ratingScore:
type: integer
format: int32
description: A measure of a party's creditworthiness calculated on the basis of a combination of factors such as their income and credit history
validFor:
$ref: '#/components/schemas/TimePeriod'
discriminator:
propertyName: '@type'
mapping:
PartyCreditProfile: '#/components/schemas/PartyCreditProfile_FVO'
CalendarPeriod_MVO:
allOf:
- $ref: '#/components/schemas/Extensible'
- type: object
properties:
day:
type: string
description: 'Day where the calendar status applies (e.g.: monday, mon-to-fri, weekdays, weekend, all week, ...)'
timeZone:
type: string
description: 'Indication of the timezone applicable to the calendar information (e.g.: Paris, GMT+1)'
hourPeriod:
type: array
items:
$ref: '#/components/schemas/HourPeriod_MVO'
status:
type: string
description: 'Indication of the availability of the caledar period (e.g.: available, booked, etc.)'
discriminator:
propertyName: '@type'
mapping:
CalendarPeriod: '#/components/schemas/CalendarPeriod_MVO'
PaymentMethodRef:
type: object
description: PaymentMethod reference. A payment method defines a specific mean of payment (e.g direct debit).
allOf:
- $ref: '#/components/schemas/EntityRef'
discriminator:
propertyName: '@type'
mapping:
PaymentMethodRef: '#/components/schemas/PaymentMethodRef'
AccountRef:
type: object
description: Account reference. A account may be a party account or a financial account.
allOf:
- $ref: '#/components/schemas/EntityRef'
discriminator:
propertyName: '@type'
mapping:
AccountRef: '#/components/schemas/AccountRef'
Place_MVO:
type: object
description: Place reference.
allOf:
- $ref: '#/components/schemas/Entity_MVO'
discriminator:
propertyName: '@type'
mapping:
Place: '#/components/schemas/Place_MVO'
GeographicSite: '#/components/schemas/GeographicSite_MVO'
GeographicLocation: '#/components/schemas/GeographicLocation_MVO'
GeographicAddress: '#/components/schemas/GeographicAddress_MVO'
RelatedOrderItem_FVO:
allOf:
- $ref: '#/components/schemas/Extensible_FVO'
- type: object
description: It's a Order item that has been executed previously.
properties:
orderItemAction:
$ref: '#/components/schemas/ItemActionType'
orderHref:
type: string
description: Reference of the related entity.
'@referredType':
type: string
description: The actual type of the target instance when needed for disambiguation.
role:
type: string
description: Role played by the Order
orderId:
type: string
description: Unique identifier of a related Order.
orderItemId:
type: string
description: Id of an item of a prduct order
required:
- role
- orderId
- orderItemId
discriminator:
propertyName: '@type'
mapping:
RelatedOrderItem: '#/components/schemas/RelatedOrderItem_FVO'
GeographicSiteRelationship_FVO:
allOf:
- $ref: '#/components/schemas/Extensible_FVO'
- type: object
properties:
href:
type: string
description: Reference of the related geographic site
role:
type: string
description: Role of the related site in the relationship
validFor:
$ref: '#/components/schemas/TimePeriod'
id:
type: string
description: Unique identifier of the related site entity within the server
# --- truncated at 32 KB (259 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/tm-forum/refs/heads/main/openapi/tm-forum-product-api-openapi.yml