mirror of https://github.com/vernonkeenan/lib
3580 lines
105 KiB
YAML
3580 lines
105 KiB
YAML
swagger: "2.0"
|
|
info:
|
|
version: 0.3.0
|
|
title: "research"
|
|
description: "Customer Information Microservice"
|
|
termsOfService: "https://salesforcedevops.net/terms/"
|
|
contact:
|
|
email: "vern@vernonkeenan.com"
|
|
license:
|
|
name: "Proprietary - Copyright (c) 2018-2024 by Vernon Keenan"
|
|
securityDefinitions:
|
|
ApiKeyAuth:
|
|
type: "apiKey"
|
|
in: "header"
|
|
name: "X-API-Key"
|
|
kvSessionCookie:
|
|
type: "apiKey"
|
|
in: "header"
|
|
name: "Cookie"
|
|
description: "Members session cookie. Credential values are never accepted in request bodies or logs."
|
|
schemes:
|
|
- "http"
|
|
basePath: "/v1"
|
|
host: "research.vernonkeenan.com:8080"
|
|
consumes:
|
|
- "application/json"
|
|
produces:
|
|
- "application/json"
|
|
parameters:
|
|
accountIdQuery:
|
|
description: Record Id of an Account
|
|
in: query
|
|
name: accountId
|
|
required: false
|
|
type: string
|
|
activeQuery:
|
|
description: Only retrieve active records?
|
|
in: query
|
|
name: active
|
|
required: false
|
|
type: boolean
|
|
companyProductIdQuery:
|
|
description: CompanyProduct record ID
|
|
in: query
|
|
name: companyProductId
|
|
required: false
|
|
type: string
|
|
companyServiceIdQuery:
|
|
description: CompanyService record ID
|
|
in: query
|
|
name: companyServiceId
|
|
required: false
|
|
type: string
|
|
companyProductRequest:
|
|
description: An array of new CompanyProduct records
|
|
in: body
|
|
name: companyProductRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductRequest"
|
|
companyProductProposalRequest:
|
|
description: A human-attributed draft proposal for an existing CompanyProduct
|
|
in: body
|
|
name: companyProductProposalRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposalRequest"
|
|
companyProductProposalIdPath:
|
|
description: CompanyProduct proposal record ID
|
|
in: path
|
|
name: companyProductProposalId
|
|
required: true
|
|
type: string
|
|
format: uuid
|
|
companyProductProposalViewQuery:
|
|
description: Actor-owned proposals or the tenant review queue
|
|
in: query
|
|
name: view
|
|
required: true
|
|
type: string
|
|
enum: [mine, review]
|
|
companyProductProposalSubmitRequest:
|
|
description: Optimistic draft submission request
|
|
in: body
|
|
name: companyProductProposalSubmitRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposalSubmitRequest"
|
|
companyProductProposalReviewRequest:
|
|
description: Complete field-level review request
|
|
in: body
|
|
name: companyProductProposalReviewRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposalReviewRequest"
|
|
companyProductProposalApplyRequest:
|
|
description: Optimistic approved-proposal application request
|
|
in: body
|
|
name: companyProductProposalApplyRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposalApplyRequest"
|
|
companyProductProposalPublishRequest:
|
|
description: Explicit, acknowledged first-publication request for an applied CompanyProduct proposal
|
|
in: body
|
|
name: companyProductProposalPublishRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposalPublishRequest"
|
|
companyServiceRequest:
|
|
description: An array of new CompanyService records
|
|
in: body
|
|
name: companyServiceRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/CompanyServiceRequest"
|
|
enrichmentRunRequest:
|
|
description: Start one bounded source-backed enrichment run
|
|
in: body
|
|
name: enrichmentRunRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/EnrichmentRunRequest"
|
|
enrichmentRunIdPath:
|
|
description: Durable enrichment run ID
|
|
in: path
|
|
name: enrichmentRunId
|
|
required: true
|
|
type: string
|
|
format: uuid
|
|
portfolioEnrichmentRunRequest:
|
|
description: Start one Account-scoped Product and Service portfolio research run; all provider, model, prompt, input snapshot, lifecycle, actor, tenant, matching, action, and save-path fields are server-owned
|
|
in: body
|
|
name: portfolioEnrichmentRunRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/PortfolioEnrichmentRunRequest"
|
|
portfolioEnrichmentRunIdPath:
|
|
description: Durable Account portfolio enrichment run ID
|
|
in: path
|
|
name: portfolioEnrichmentRunId
|
|
required: true
|
|
type: string
|
|
format: uuid
|
|
portfolioReconciliationRequest:
|
|
description: One explicitly acknowledged Discovery-mode direct-write decision for an immutable candidate in a completed portfolio enrichment run
|
|
in: body
|
|
name: portfolioReconciliationRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/PortfolioReconciliationRequest"
|
|
contactIdQuery:
|
|
description: Contact record ID
|
|
in: query
|
|
name: contactId
|
|
required: false
|
|
type: string
|
|
emailQuery:
|
|
description: Email address used for identity lookup
|
|
in: query
|
|
name: email
|
|
required: false
|
|
type: string
|
|
factorIdQuery:
|
|
description: Factor record ID
|
|
in: query
|
|
name: factorId
|
|
required: false
|
|
type: string
|
|
financialStatementIdQuery:
|
|
description: Financial Statement record ID
|
|
in: query
|
|
name: financialStatementId
|
|
required: false
|
|
type: string
|
|
factorRequest:
|
|
description: An array of new Factor records
|
|
in: body
|
|
name: factorRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/FactorRequest"
|
|
financialStatementRequest:
|
|
description: An array of new FinancialStatement records
|
|
in: body
|
|
name: financialStatementRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/FinancialStatementRequest"
|
|
industryCompanyIdQuery:
|
|
description: IndustryCompany record ID
|
|
in: query
|
|
name: industryCompanyId
|
|
required: false
|
|
type: string
|
|
companyIdQuery:
|
|
description: Company record ID
|
|
in: query
|
|
name: companyId
|
|
required: false
|
|
type: string
|
|
industryCompanyRequest:
|
|
description: An array of new IndustryCompany records
|
|
in: body
|
|
name: industryCompanyRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/IndustryCompanyRequest"
|
|
industryIdQuery:
|
|
description: Industry record ID
|
|
in: query
|
|
name: industryId
|
|
required: false
|
|
type: string
|
|
productCategoryQuery:
|
|
description: Is this industry a product category?
|
|
in: query
|
|
name: productCategory
|
|
required: false
|
|
type: boolean
|
|
serviceCategoryQuery:
|
|
description: Is this industry a service category?
|
|
in: query
|
|
name: serviceCategory
|
|
required: false
|
|
type: boolean
|
|
industryProductIdQuery:
|
|
description: IndustryProduct record ID
|
|
in: query
|
|
name: industryProductId
|
|
required: false
|
|
type: string
|
|
industryProductRequest:
|
|
description: An array of new IndustryProduct records
|
|
in: body
|
|
name: industryProductRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/IndustryProductRequest"
|
|
industryServiceIdQuery:
|
|
description: IndustryService record ID
|
|
in: query
|
|
name: industryServiceId
|
|
required: false
|
|
type: string
|
|
industryServiceRequest:
|
|
description: An array of new IndustryService records
|
|
in: body
|
|
name: industryServiceRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/IndustryServiceRequest"
|
|
industryRequest:
|
|
description: An array of new Industry records
|
|
in: body
|
|
name: industryRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/IndustryRequest"
|
|
leadIdQuery:
|
|
description: Lead record ID
|
|
in: query
|
|
name: leadId
|
|
required: false
|
|
type: string
|
|
limitQuery:
|
|
description: How many objects to return at one time
|
|
format: int64
|
|
in: query
|
|
name: limit
|
|
required: false
|
|
type: integer
|
|
nameQuery:
|
|
description: The Name of this Object
|
|
in: query
|
|
name: name
|
|
required: false
|
|
type: string
|
|
slugQuery:
|
|
description: The Slug of this Object
|
|
in: query
|
|
name: slug
|
|
required: false
|
|
type: string
|
|
observationIdQuery:
|
|
description: Observation record ID
|
|
in: query
|
|
name: observationId
|
|
required: false
|
|
type: string
|
|
observationRequest:
|
|
description: An array of new Observation records
|
|
in: body
|
|
name: observationRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/ObservationRequest"
|
|
offsetQuery:
|
|
description: How many objects to skip?
|
|
format: int64
|
|
in: query
|
|
name: offset
|
|
required: false
|
|
type: integer
|
|
topicIdQuery:
|
|
description: Topic record ID
|
|
in: query
|
|
name: topicId
|
|
required: false
|
|
type: string
|
|
topicRequest:
|
|
description: An array of new Topic records
|
|
in: body
|
|
name: topicRequest
|
|
required: true
|
|
schema:
|
|
$ref: "#/definitions/TopicRequest"
|
|
typeQuery:
|
|
description: The Type of this Object
|
|
in: query
|
|
name: type
|
|
required: false
|
|
type: string
|
|
|
|
responses:
|
|
AccessForbidden:
|
|
description: Access forbidden, account lacks access
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
CompanyProductResponse:
|
|
description: Response with CompanyProduct objects
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductResponse"
|
|
CompanyServiceResponse:
|
|
description: Response with CompanyService objects
|
|
schema:
|
|
$ref: "#/definitions/CompanyServiceResponse"
|
|
Conflict:
|
|
description: Conflict
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
DeleteResponse:
|
|
description: Response with Message Objects with Delete Status
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/DeleteResponse"
|
|
FactorResponse:
|
|
description: Response with Factor objects
|
|
schema:
|
|
$ref: "#/definitions/FactorResponse"
|
|
FinancialStatementResponse:
|
|
description: Response with FinancialStatement objects
|
|
schema:
|
|
$ref: "#/definitions/FinancialStatementResponse"
|
|
IndustryCompanyResponse:
|
|
description: Response with IndustryCompany objects
|
|
schema:
|
|
$ref: "#/definitions/IndustryCompanyResponse"
|
|
IndustryProductResponse:
|
|
description: Response with IndustryProduct objects
|
|
schema:
|
|
$ref: "#/definitions/IndustryProductResponse"
|
|
IndustryServiceResponse:
|
|
description: Response with IndustryService objects
|
|
schema:
|
|
$ref: "#/definitions/IndustryServiceResponse"
|
|
IndustryResponse:
|
|
description: Response with Industry objects
|
|
schema:
|
|
$ref: "#/definitions/IndustryResponse"
|
|
InvalidDataError:
|
|
description: Invalid data was sent
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/InvalidError"
|
|
NotFound:
|
|
description: Resource was not found
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
ObservationResponse:
|
|
description: Response with Observation objects
|
|
schema:
|
|
$ref: "#/definitions/ObservationResponse"
|
|
ServerError:
|
|
description: Server Internal Error
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
TopicResponse:
|
|
description: Response with Topic objects
|
|
schema:
|
|
$ref: "#/definitions/TopicResponse"
|
|
Unauthorized:
|
|
description: Access unauthorized, invalid API-KEY was used
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
UnprocessableEntity:
|
|
description: Unprocessable Entity, likely a bad parameter
|
|
headers:
|
|
Access-Control-Allow-Origin:
|
|
type: string
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
CompanyCategoryResponse:
|
|
description: The SalesforceDevops.net CompanyCategory Object
|
|
schema:
|
|
$ref: "#/definitions/CompanyCategoryResponse"
|
|
|
|
paths:
|
|
/companycategories:
|
|
get:
|
|
description: Return all or a single company category fully hydrated object
|
|
operationId: getCompanyCategories
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyCategoryResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of company categories
|
|
tags:
|
|
- CompanyCategories
|
|
/companyservices:
|
|
get:
|
|
description: Return CompanyServices under compound native service and same-tenant human authentication; requires research:company-service:read
|
|
operationId: getCompanyServices
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/slugQuery"
|
|
- $ref: "#/parameters/accountIdQuery"
|
|
- $ref: "#/parameters/companyServiceIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyServiceResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Get a list of company services
|
|
tags:
|
|
- CompanyServices
|
|
post:
|
|
description: Create one unpublished CompanyService beneath an Account owned by the machine tenant; requires research:company-service:create and same-tenant Owner or Manager
|
|
operationId: postCompanyServices
|
|
parameters:
|
|
- $ref: "#/parameters/companyServiceRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyServiceResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Create a new CompanyService
|
|
tags:
|
|
- CompanyServices
|
|
put:
|
|
description: Replace the editable fields of one tenant-owned CompanyService using optimistic concurrency while preserving publication, enrichment audit, and media ownership; requires research:company-service:update and same-tenant Owner or Manager
|
|
operationId: putCompanyService
|
|
parameters:
|
|
- $ref: "#/parameters/companyServiceRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyServiceResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update one tenant-owned CompanyService
|
|
tags:
|
|
- CompanyServices
|
|
/publishedcompanyservices:
|
|
get:
|
|
description: Return only published CompanyServices whose owning CRM Account is also published; requires a tenant-bound native service principal with the exact research:company-service:public-read scope and does not accept a human session
|
|
operationId: getPublishedCompanyServices
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/slugQuery"
|
|
- $ref: "#/parameters/accountIdQuery"
|
|
- $ref: "#/parameters/companyServiceIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyServiceResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get the machine-readable published CompanyService catalog
|
|
tags:
|
|
- CompanyServices
|
|
/companyproducts:
|
|
get:
|
|
description: Return CompanyProducts under compound native service and same-tenant human authentication; requires research:company-product:read
|
|
operationId: getCompanyProducts
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/slugQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/activeQuery"
|
|
- $ref: "#/parameters/accountIdQuery"
|
|
- $ref: "#/parameters/companyProductIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyProductResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Get a list of companyproducts
|
|
tags:
|
|
- CompanyProducts
|
|
post:
|
|
description: Create one unpublished CompanyProduct beneath an Account owned by the machine tenant; requires research:company-product:create and same-tenant Owner or Manager
|
|
operationId: postCompanyProducts
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyProductResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Create one tenant-owned CompanyProduct
|
|
tags:
|
|
- CompanyProducts
|
|
put:
|
|
description: Replace the editable fields of one shared-catalog CompanyProduct using optimistic concurrency while preserving its immutable Account binding, publication state, enrichment audit, and media ownership. Published Products require the governed proposal workflow. Requires research:company-product:update and a same-tenant Owner or Manager.
|
|
operationId: putCompanyProduct
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyProductResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update one unpublished shared-catalog CompanyProduct
|
|
tags:
|
|
- CompanyProducts
|
|
/publishedcompanyproducts:
|
|
get:
|
|
description: Return only published CompanyProducts whose owning CRM Account is also published; requires a tenant-bound native service principal with the exact research:company-product:public-read scope and does not accept a human session
|
|
operationId: getPublishedCompanyProducts
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/slugQuery"
|
|
- $ref: "#/parameters/accountIdQuery"
|
|
- $ref: "#/parameters/companyProductIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/CompanyProductResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get the machine-readable published CompanyProduct catalog
|
|
tags:
|
|
- CompanyProducts
|
|
/companyproductproposals:
|
|
get:
|
|
description: Return actor-owned proposals or the submitted tenant review queue
|
|
operationId: getCompanyProductProposals
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalViewQuery"
|
|
- $ref: "#/parameters/companyProductIdQuery"
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
responses:
|
|
"200":
|
|
description: Governed proposal collection
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposalResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: List CompanyProduct proposals
|
|
tags:
|
|
- CompanyProductProposals
|
|
post:
|
|
description: Create a manual or optionally enrichment-linked draft proposal without changing the authoritative CompanyProduct or immutable enrichment evidence
|
|
operationId: postCompanyProductProposal
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalRequest"
|
|
responses:
|
|
"201":
|
|
description: Draft proposal created
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
"400":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Product version or idempotency conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Create a CompanyProduct draft proposal
|
|
tags:
|
|
- CompanyProductProposals
|
|
/companyproductproposals/{companyProductProposalId}:
|
|
get:
|
|
description: Return one visible CompanyProduct proposal
|
|
operationId: getCompanyProductProposal
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalIdPath"
|
|
responses:
|
|
"200":
|
|
description: Governed proposal detail
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Get a CompanyProduct proposal
|
|
tags:
|
|
- CompanyProductProposals
|
|
/companyproductproposals/{companyProductProposalId}/submit:
|
|
post:
|
|
description: Submit an actor-owned draft without changing the authoritative CompanyProduct
|
|
operationId: submitCompanyProductProposal
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalIdPath"
|
|
- $ref: "#/parameters/companyProductProposalSubmitRequest"
|
|
responses:
|
|
"200":
|
|
description: Proposal submitted for review
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Proposal state or optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Submit a CompanyProduct proposal
|
|
tags:
|
|
- CompanyProductProposals
|
|
/companyproductproposals/{companyProductProposalId}/review:
|
|
post:
|
|
description: Decide every field on a submitted proposal without changing the authoritative CompanyProduct
|
|
operationId: reviewCompanyProductProposal
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalIdPath"
|
|
- $ref: "#/parameters/companyProductProposalReviewRequest"
|
|
responses:
|
|
"200":
|
|
description: Proposal review completed
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Proposal state or optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Review a CompanyProduct proposal
|
|
tags:
|
|
- CompanyProductProposals
|
|
/companyproductproposals/{companyProductProposalId}/apply:
|
|
post:
|
|
description: Apply accepted fields from an independently approved proposal to the authoritative CompanyProduct; an already-published Product receives an atomic republish receipt so the live change is explicit and auditable
|
|
operationId: applyCompanyProductProposal
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalIdPath"
|
|
- $ref: "#/parameters/companyProductProposalApplyRequest"
|
|
responses:
|
|
"200":
|
|
description: Proposal applied, or an identical completed application replayed
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Proposal lifecycle, provenance, or optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Apply an approved CompanyProduct proposal
|
|
tags:
|
|
- CompanyProductProposals
|
|
/companyproductproposals/{companyProductProposalId}/publish:
|
|
post:
|
|
description: Explicitly publish an unpublished CompanyProduct after independently reviewed proposal application; requires research:company-product:publish, exact proposal and Product versions, acknowledgement, reason, and idempotency
|
|
operationId: publishCompanyProductProposal
|
|
parameters:
|
|
- $ref: "#/parameters/companyProductProposalIdPath"
|
|
- $ref: "#/parameters/companyProductProposalPublishRequest"
|
|
responses:
|
|
"200":
|
|
description: Product published with its bounded receipt, or an identical completed publication replayed without writes
|
|
schema:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Proposal, Product, publication state, or idempotency conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Publish an applied CompanyProduct proposal
|
|
tags:
|
|
- CompanyProductProposals
|
|
/enrichmentruns:
|
|
post:
|
|
description: Run bounded Account, shared-catalog Company Product, or tenant-owned Company Service web research, persist cited field candidates, and leave the authoritative subject unchanged; requires a native service principal with research:enrichment-run:create and active same-tenant contributing membership
|
|
operationId: postEnrichmentRun
|
|
parameters:
|
|
- $ref: "#/parameters/enrichmentRunRequest"
|
|
responses:
|
|
"201":
|
|
description: Completed cited enrichment run
|
|
schema:
|
|
$ref: "#/definitions/EnrichmentRun"
|
|
"400":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"502":
|
|
description: External research provider failed safely
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"504":
|
|
description: External research provider timed out safely
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Create a cited enrichment run
|
|
tags:
|
|
- EnrichmentRuns
|
|
/enrichmentruns/{enrichmentRunId}:
|
|
get:
|
|
description: Return one durable same-tenant enrichment run with its cited candidates; requires research:enrichment-run:read
|
|
operationId: getEnrichmentRun
|
|
parameters:
|
|
- $ref: "#/parameters/enrichmentRunIdPath"
|
|
responses:
|
|
"200":
|
|
description: Durable cited enrichment run
|
|
schema:
|
|
$ref: "#/definitions/EnrichmentRun"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Get one cited enrichment run
|
|
tags:
|
|
- EnrichmentRuns
|
|
/portfolioenrichmentruns:
|
|
post:
|
|
description: Start one bounded asynchronous portfolio_enrichment.v1 Product and Service research run for a same-tenant Account; requires research:enrichment-run:create, dispatches only after the durable idempotent insert wins, never redispatches an ambiguous start, and never writes authoritative Product, Service, relationship, approval, or publication state
|
|
operationId: postPortfolioEnrichmentRun
|
|
parameters:
|
|
- $ref: "#/parameters/portfolioEnrichmentRunRequest"
|
|
responses:
|
|
"202":
|
|
description: Durable running or safely terminal portfolio enrichment run
|
|
schema:
|
|
$ref: "#/definitions/PortfolioEnrichmentRun"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"503":
|
|
description: Private portfolio worker is temporarily unavailable
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Start one Account portfolio enrichment run
|
|
tags:
|
|
- PortfolioEnrichmentRuns
|
|
/portfolioenrichmentruns/{portfolioEnrichmentRunId}:
|
|
get:
|
|
description: Return one durable same-tenant portfolio_enrichment.v1 run; requires research:enrichment-run:read
|
|
operationId: getPortfolioEnrichmentRun
|
|
parameters:
|
|
- $ref: "#/parameters/portfolioEnrichmentRunIdPath"
|
|
responses:
|
|
"200":
|
|
description: Durable running, completed, or failed portfolio enrichment run
|
|
schema:
|
|
$ref: "#/definitions/PortfolioEnrichmentRun"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"503":
|
|
description: Portfolio enrichment runtime is temporarily unavailable
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Get one Account portfolio enrichment run
|
|
tags:
|
|
- PortfolioEnrichmentRuns
|
|
/portfolioenrichmentruns/{portfolioEnrichmentRunId}/advance:
|
|
post:
|
|
description: Advance one running same-tenant portfolio_enrichment.v1 job through the private worker boundary; requires research:enrichment-run:create, is idempotent for terminal runs, never retries a worker start whose response ID was not durably captured, and performs no authoritative Product or Service writes
|
|
operationId: advancePortfolioEnrichmentRun
|
|
parameters:
|
|
- $ref: "#/parameters/portfolioEnrichmentRunIdPath"
|
|
responses:
|
|
"200":
|
|
description: Current durable running or terminal portfolio enrichment run
|
|
schema:
|
|
$ref: "#/definitions/PortfolioEnrichmentRun"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"503":
|
|
description: Private portfolio worker is temporarily unavailable
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Advance one Account portfolio enrichment run
|
|
tags:
|
|
- PortfolioEnrichmentRuns
|
|
/portfolioenrichmentruns/{portfolioEnrichmentRunId}/reconciliations:
|
|
post:
|
|
description: Create or compare-and-swap update exactly one authoritative Product or Service from one immutable direct-write candidate in a completed same-tenant portfolio_enrichment.v1 run. This Discovery-only operation requires an active server-side tenant policy for the exact entity action, the matching create or update scope, an active Owner or Manager session, explicit acknowledgement, and an idempotency key. Operator-selected field values remain distinct from immutable candidate provenance. Legacy Product governed-update candidates are not silently converted to direct writes and must be rerun. It never deletes, creates relationships, proposes, reviews, applies, or publishes.
|
|
operationId: postPortfolioReconciliation
|
|
parameters:
|
|
- $ref: "#/parameters/portfolioEnrichmentRunIdPath"
|
|
- $ref: "#/parameters/portfolioReconciliationRequest"
|
|
responses:
|
|
"200":
|
|
description: Immutable reconciliation receipt for the created or updated authoritative target, including an exact idempotent replay
|
|
schema:
|
|
$ref: "#/definitions/PortfolioReconciliationReceipt"
|
|
"400":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"503":
|
|
description: Portfolio reconciliation policy or persistence runtime is temporarily unavailable
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Reconcile one portfolio candidate in Discovery mode
|
|
tags:
|
|
- PortfolioEnrichmentRuns
|
|
/factors:
|
|
delete:
|
|
description: Delete Factor record
|
|
operationId: deleteFactor
|
|
parameters:
|
|
- $ref: "#/parameters/factorIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/DeleteResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Delete An Factor
|
|
tags:
|
|
- Factors
|
|
get:
|
|
description: Return a list of all available Factors
|
|
operationId: getFactors
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/nameQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/activeQuery"
|
|
- $ref: "#/parameters/factorIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/FactorResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of factors
|
|
tags:
|
|
- Factors
|
|
post:
|
|
description: Factor records to be added
|
|
operationId: postFactors
|
|
parameters:
|
|
- $ref: "#/parameters/factorRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/FactorResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a new factor
|
|
tags:
|
|
- Factors
|
|
put:
|
|
description: Update factor records
|
|
operationId: putFactor
|
|
parameters:
|
|
- $ref: "#/parameters/factorRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/FactorResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update factor records
|
|
tags:
|
|
- Factors
|
|
/financialstatements:
|
|
delete:
|
|
description: Delete FinancialStatement record
|
|
operationId: deleteFinancialStatement
|
|
parameters:
|
|
- $ref: "#/parameters/financialStatementIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/DeleteResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Delete An FinancialStatement
|
|
tags:
|
|
- FinancialStatements
|
|
get:
|
|
description: Return a list of all available FinancialStatements
|
|
operationId: getFinancialStatements
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/activeQuery"
|
|
- $ref: "#/parameters/accountIdQuery"
|
|
- $ref: "#/parameters/financialStatementIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/FinancialStatementResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of financialStatements
|
|
tags:
|
|
- FinancialStatements
|
|
post:
|
|
description: FinancialStatement records to be added
|
|
operationId: postFinancialStatements
|
|
parameters:
|
|
- $ref: "#/parameters/financialStatementRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/FinancialStatementResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a new financial statement
|
|
tags:
|
|
- FinancialStatements
|
|
put:
|
|
description: Update financialStatement records
|
|
operationId: putFinancialStatement
|
|
parameters:
|
|
- $ref: "#/parameters/financialStatementRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/FinancialStatementResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update financialStatement records
|
|
tags:
|
|
- FinancialStatements
|
|
/industries:
|
|
get:
|
|
description: Retrieve the shared global Industry taxonomy. Requires research:industry:read on a tenant-bound service principal; the tenant authorizes the caller but does not own taxonomy rows.
|
|
operationId: getIndustries
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/slugQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/industryIdQuery"
|
|
- $ref: "#/parameters/productCategoryQuery"
|
|
- $ref: "#/parameters/serviceCategoryQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get Industry records
|
|
tags:
|
|
- Industry
|
|
post:
|
|
description: Add exactly one shared global Industry with server-owned ID and audit fields. Requires research:industry:create plus an active Owner or Manager session in the machine tenant.
|
|
operationId: postIndustries
|
|
parameters:
|
|
- $ref: "#/parameters/industryRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a shared Industry taxonomy record
|
|
tags:
|
|
- Industry
|
|
put:
|
|
description: Optimistically replace the editable fields of exactly one shared global Industry. ID and LastModifiedDate form the compare-and-swap contract; audit fields are server-owned. Requires research:industry:update plus an active Owner or Manager session in the machine tenant.
|
|
operationId: putIndustries
|
|
parameters:
|
|
- $ref: "#/parameters/industryRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
$ref: "#/responses/Conflict"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update a shared Industry taxonomy record
|
|
tags:
|
|
- Industry
|
|
/industrycompanies:
|
|
delete:
|
|
description: Reserved compatibility operation. Runtime removal remains disabled until a recoverable relationship-event or tombstone contract exists.
|
|
operationId: deleteIndustryCompany
|
|
parameters:
|
|
- $ref: "#/parameters/industryCompanyIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/DeleteResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Delete An IndustryCompany
|
|
tags:
|
|
- IndustryCompanies
|
|
get:
|
|
description: Return IndustryCompany links attributed to the caller tenant through crm.account. Requires research:industry-company:read.
|
|
operationId: getIndustryCompanies
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/nameQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/activeQuery"
|
|
- $ref: "#/parameters/industryCompanyIdQuery"
|
|
- $ref: "#/parameters/companyIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryCompanyResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of industrycompanies
|
|
tags:
|
|
- IndustryCompanies
|
|
post:
|
|
description: Idempotently add exactly one IndustryCompany link attributed through the referenced CRM Account tenant. ID and audit fields are server-owned. Requires research:industry-company:create plus an active Owner or Manager session.
|
|
operationId: postIndustryCompanies
|
|
parameters:
|
|
- $ref: "#/parameters/industryCompanyRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryCompanyResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a tenant-attributed IndustryCompany link
|
|
tags:
|
|
- IndustryCompanies
|
|
/industryservices:
|
|
delete:
|
|
description: Reserved compatibility operation. Runtime removal remains disabled until a recoverable relationship-event or tombstone contract exists.
|
|
operationId: deleteIndustryService
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/industryServiceIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/DeleteResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Delete An IndustryService
|
|
tags:
|
|
- IndustryServices
|
|
get:
|
|
description: Return IndustryService links attributed to the caller tenant through CompanyService and crm.account. Requires research:industry-service:read.
|
|
operationId: getIndustryServices
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/industryServiceIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryServiceResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of industryservices
|
|
tags:
|
|
- IndustryServices
|
|
post:
|
|
description: Idempotently add exactly one tenant-attributed IndustryService link. ID and audit fields are server-owned. Requires research:industry-service:create plus an active Owner or Manager session.
|
|
operationId: postIndustryServices
|
|
parameters:
|
|
- $ref: "#/parameters/industryServiceRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryServiceResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a tenant-attributed IndustryService link
|
|
tags:
|
|
- IndustryServices
|
|
/industryproducts:
|
|
delete:
|
|
description: Reserved compatibility operation. Runtime removal remains disabled until a recoverable relationship-event or tombstone contract exists.
|
|
operationId: deleteIndustryProduct
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/industryProductIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/DeleteResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Delete An IndustryProduct
|
|
tags:
|
|
- IndustryProducts
|
|
get:
|
|
description: Return IndustryProduct links attributed to the caller tenant through CompanyProduct and crm.account. Requires research:industry-product:read.
|
|
operationId: getIndustryProducts
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/nameQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/activeQuery"
|
|
- $ref: "#/parameters/industryProductIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryProductResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of industryProducts
|
|
tags:
|
|
- IndustryProducts
|
|
post:
|
|
description: Idempotently add exactly one tenant-attributed IndustryProduct link. ID and audit fields are server-owned. Requires research:industry-product:create plus an active Owner or Manager session.
|
|
operationId: postIndustryProducts
|
|
parameters:
|
|
- $ref: "#/parameters/industryProductRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/IndustryProductResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a tenant-attributed IndustryProduct link
|
|
tags:
|
|
- IndustryProducts
|
|
/observations:
|
|
delete:
|
|
description: Delete Observation record
|
|
operationId: deleteObservation
|
|
parameters:
|
|
- $ref: "#/parameters/observationIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/DeleteResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Delete An Observation
|
|
tags:
|
|
- Observations
|
|
get:
|
|
description: Return a list of all available Observations
|
|
operationId: getObservations
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/activeQuery"
|
|
- $ref: "#/parameters/observationIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/ObservationResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get a list of observations
|
|
tags:
|
|
- Observations
|
|
post:
|
|
description: Observation record to be added
|
|
operationId: postObservations
|
|
parameters:
|
|
- $ref: "#/parameters/observationRequest"
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/ObservationResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add a new observation
|
|
tags:
|
|
- Observations
|
|
put:
|
|
description: Update a single observation specified by observationId
|
|
operationId: putObservation
|
|
parameters:
|
|
- $ref: "#/parameters/observationRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/ObservationResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update a single observation
|
|
tags:
|
|
- Observations
|
|
/topics:
|
|
get:
|
|
description: Retrieve Topic records from the microservice
|
|
operationId: getTopics
|
|
parameters:
|
|
- $ref: "#/parameters/limitQuery"
|
|
- $ref: "#/parameters/offsetQuery"
|
|
- $ref: "#/parameters/topicIdQuery"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/TopicResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
summary: Get Topic records
|
|
tags:
|
|
- Topics
|
|
post:
|
|
description: Add new topics
|
|
operationId: postTopics
|
|
parameters:
|
|
- $ref: "#/parameters/topicRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/TopicResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Add new topics
|
|
tags:
|
|
- Topics
|
|
put:
|
|
description: Update one Topic record using optimistic concurrency
|
|
operationId: putTopic
|
|
parameters:
|
|
- $ref: "#/parameters/topicRequest"
|
|
responses:
|
|
"200":
|
|
$ref: "#/responses/TopicResponse"
|
|
"401":
|
|
$ref: "#/responses/Unauthorized"
|
|
"403":
|
|
$ref: "#/responses/AccessForbidden"
|
|
"404":
|
|
$ref: "#/responses/NotFound"
|
|
"409":
|
|
description: Optimistic version conflict
|
|
schema:
|
|
$ref: "#/definitions/Error"
|
|
"422":
|
|
$ref: "#/responses/UnprocessableEntity"
|
|
"500":
|
|
$ref: "#/responses/ServerError"
|
|
security:
|
|
- ApiKeyAuth: []
|
|
kvSessionCookie: []
|
|
summary: Update one Topic record
|
|
tags:
|
|
- Topics
|
|
|
|
definitions:
|
|
Address:
|
|
$ref: "../../lib/swagger/defs/address.yaml#/Address"
|
|
CompanyCategory:
|
|
properties:
|
|
CloudType:
|
|
description: The Type of Cloud Company
|
|
type: string
|
|
Count:
|
|
description: The number of companies
|
|
type: number
|
|
type: object
|
|
CompanyCategoryResponse:
|
|
description: An array of CompanyCategory objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "#/definitions/CompanyCategory"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
CompanyProductRequest:
|
|
description: An array of CompanyProduct objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/company-product.yaml#/CompanyProduct"
|
|
type: array
|
|
type: object
|
|
CompanyProductProposalField:
|
|
description: One governed CompanyProduct field change; EnrichmentCandidateID is optional for manual proposals and required on every field when the proposal carries EnrichmentRunID
|
|
required:
|
|
- FieldName
|
|
- ProposedValue
|
|
properties:
|
|
FieldName:
|
|
type: string
|
|
enum:
|
|
- description
|
|
- enrichmentstatus
|
|
- fulldescription
|
|
- imagealttext
|
|
- imageurl
|
|
- logo
|
|
- name
|
|
- slug
|
|
- tagline
|
|
- url
|
|
ProposedValue:
|
|
description: Human-editable proposed JSON value. It may differ from the immutable enrichment candidate value.
|
|
type: string
|
|
maxLength: 20000
|
|
EnrichmentCandidateID:
|
|
description: Optional immutable enrichment candidate provenance for this field
|
|
type: string
|
|
format: uuid
|
|
x-nullable: true
|
|
CurrentValue:
|
|
description: Current authoritative value captured when the proposal was created
|
|
type: string
|
|
x-nullable: true
|
|
Decision:
|
|
type: string
|
|
enum: [pending, accepted, rejected]
|
|
DecidedByID:
|
|
type: string
|
|
format: uuid
|
|
x-nullable: true
|
|
DecidedAt:
|
|
type: string
|
|
format: date-time
|
|
x-nullable: true
|
|
DecisionReason:
|
|
type: string
|
|
maxLength: 1000
|
|
x-nullable: true
|
|
type: object
|
|
CompanyProductProposalRequest:
|
|
description: Update-only proposal; tenant, actor, client, status, and audit fields are server-owned. EnrichmentRunID and every field EnrichmentCandidateID must be supplied together or all omitted.
|
|
required:
|
|
- CompanyProductID
|
|
- BaseVersion
|
|
- IdempotencyKey
|
|
- Fields
|
|
properties:
|
|
CompanyProductID:
|
|
type: string
|
|
format: uuid
|
|
BaseVersion:
|
|
type: string
|
|
format: date-time
|
|
IdempotencyKey:
|
|
type: string
|
|
minLength: 8
|
|
maxLength: 120
|
|
pattern: "^[A-Za-z0-9._:-]+$"
|
|
EnrichmentRunID:
|
|
description: Optional completed Company Product enrichment run provenance
|
|
type: string
|
|
format: uuid
|
|
x-nullable: true
|
|
Fields:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 10
|
|
uniqueItems: true
|
|
items:
|
|
$ref: "#/definitions/CompanyProductProposalField"
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductProposal:
|
|
description: Server-owned draft proposal; it does not imply approval or authoritative publication
|
|
required:
|
|
- ID
|
|
- TenantID
|
|
- CompanyProductID
|
|
- Operation
|
|
- Status
|
|
- BaseVersion
|
|
- ProposedByID
|
|
- ClientPrincipalKey
|
|
- CreatedDate
|
|
- LastModifiedDate
|
|
- Fields
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
TenantID:
|
|
type: string
|
|
format: uuid
|
|
CompanyProductID:
|
|
type: string
|
|
format: uuid
|
|
CompanyProductName:
|
|
type: string
|
|
x-nullable: true
|
|
Operation:
|
|
type: string
|
|
enum: [update]
|
|
Status:
|
|
type: string
|
|
enum: [draft, submitted, approved, rejected, applied]
|
|
BaseVersion:
|
|
type: string
|
|
format: date-time
|
|
ProposedByID:
|
|
type: string
|
|
format: uuid
|
|
ClientPrincipalKey:
|
|
type: string
|
|
CreatedDate:
|
|
type: string
|
|
format: date-time
|
|
LastModifiedDate:
|
|
type: string
|
|
format: date-time
|
|
SubmittedAt:
|
|
type: string
|
|
format: date-time
|
|
x-nullable: true
|
|
ReviewedByID:
|
|
type: string
|
|
format: uuid
|
|
x-nullable: true
|
|
ReviewedAt:
|
|
type: string
|
|
format: date-time
|
|
x-nullable: true
|
|
ReviewReason:
|
|
type: string
|
|
maxLength: 1000
|
|
x-nullable: true
|
|
EnrichmentRunID:
|
|
description: Optional completed Company Product enrichment run provenance
|
|
type: string
|
|
format: uuid
|
|
x-nullable: true
|
|
AppliedByID:
|
|
type: string
|
|
format: uuid
|
|
x-nullable: true
|
|
AppliedAt:
|
|
type: string
|
|
format: date-time
|
|
x-nullable: true
|
|
AppliedProductVersion:
|
|
description: Exact authoritative Product version produced by proposal application
|
|
type: string
|
|
format: date-time
|
|
x-nullable: true
|
|
Publication:
|
|
description: Bounded publication or republish receipt associated with this proposal
|
|
$ref: "#/definitions/CompanyProductPublication"
|
|
Fields:
|
|
type: array
|
|
items:
|
|
$ref: "#/definitions/CompanyProductProposalField"
|
|
type: object
|
|
CompanyProductProposalResponse:
|
|
description: A bounded collection of visible CompanyProduct proposals
|
|
required:
|
|
- Data
|
|
properties:
|
|
Data:
|
|
type: array
|
|
items:
|
|
$ref: "#/definitions/CompanyProductProposal"
|
|
type: object
|
|
CompanyProductProposalSubmitRequest:
|
|
description: Optimistic submission input; lifecycle and attribution remain server-owned
|
|
required:
|
|
- ExpectedLastModifiedDate
|
|
properties:
|
|
ExpectedLastModifiedDate:
|
|
type: string
|
|
format: date-time
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductProposalFieldDecision:
|
|
description: One complete reviewer decision for a proposed field
|
|
required:
|
|
- FieldName
|
|
- Decision
|
|
properties:
|
|
FieldName:
|
|
type: string
|
|
enum:
|
|
- description
|
|
- enrichmentstatus
|
|
- fulldescription
|
|
- imagealttext
|
|
- imageurl
|
|
- logo
|
|
- name
|
|
- slug
|
|
- tagline
|
|
- url
|
|
Decision:
|
|
type: string
|
|
enum: [accepted, rejected]
|
|
DecisionReason:
|
|
type: string
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductProposalReviewRequest:
|
|
description: Complete atomic field review; rejected fields require a decision reason
|
|
required:
|
|
- ExpectedLastModifiedDate
|
|
- ReviewReason
|
|
- Fields
|
|
properties:
|
|
ExpectedLastModifiedDate:
|
|
type: string
|
|
format: date-time
|
|
ReviewReason:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
Fields:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 10
|
|
uniqueItems: true
|
|
items:
|
|
$ref: "#/definitions/CompanyProductProposalFieldDecision"
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductProposalApplyRequest:
|
|
description: Optimistic application input; lifecycle and attribution remain server-owned
|
|
required:
|
|
- ExpectedLastModifiedDate
|
|
properties:
|
|
ExpectedLastModifiedDate:
|
|
description: LastModifiedDate observed while the proposal was approved
|
|
type: string
|
|
format: date-time
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductProposalPublishRequest:
|
|
description: Explicit first-publication input; publication lifecycle and attribution remain server-owned
|
|
required:
|
|
- ExpectedLastModifiedDate
|
|
- IdempotencyKey
|
|
- Acknowledged
|
|
- Reason
|
|
properties:
|
|
ExpectedLastModifiedDate:
|
|
description: LastModifiedDate observed while the proposal was applied
|
|
type: string
|
|
format: date-time
|
|
IdempotencyKey:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 120
|
|
Acknowledged:
|
|
description: Explicit acknowledgement that publication makes this Product visible to published-catalog readers
|
|
type: boolean
|
|
enum: [true]
|
|
Reason:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductPublication:
|
|
description: Bounded append-only publication receipt; credentials and client principal keys are never exposed
|
|
required:
|
|
- ID
|
|
- CompanyProductID
|
|
- ProposalID
|
|
- Operation
|
|
- FromPublished
|
|
- ToPublished
|
|
- BaseVersion
|
|
- ResultingVersion
|
|
- ActorUserID
|
|
- Reason
|
|
- CreatedDate
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
CompanyProductID:
|
|
type: string
|
|
format: uuid
|
|
ProposalID:
|
|
type: string
|
|
format: uuid
|
|
Operation:
|
|
type: string
|
|
enum: [publish, republish]
|
|
FromPublished:
|
|
type: boolean
|
|
ToPublished:
|
|
type: boolean
|
|
BaseVersion:
|
|
type: string
|
|
format: date-time
|
|
ResultingVersion:
|
|
type: string
|
|
format: date-time
|
|
ActorUserID:
|
|
type: string
|
|
format: uuid
|
|
Reason:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
CreatedDate:
|
|
type: string
|
|
format: date-time
|
|
additionalProperties: false
|
|
type: object
|
|
CompanyProductResponse:
|
|
description: An array of CompanyProduct objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/company-product.yaml#/CompanyProduct"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
CompanyServiceRequest:
|
|
description: An array of CompanyService objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/company-service.yaml#/CompanyService"
|
|
type: array
|
|
type: object
|
|
CompanyServiceResponse:
|
|
description: An array of CompanyService objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/company-service.yaml#/CompanyService"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
EnrichmentRunRequest:
|
|
description: Browser-independent request for one governed Account, shared-catalog Company Product, or tenant-owned Company Service research profile; prompts, provider, model, and field allowlists remain server-owned
|
|
required:
|
|
- SubjectType
|
|
- SubjectID
|
|
- BaseVersion
|
|
- IdempotencyKey
|
|
properties:
|
|
SubjectType:
|
|
type: string
|
|
enum: [account, company_product, company_service]
|
|
SubjectID:
|
|
type: string
|
|
format: uuid
|
|
BaseVersion:
|
|
type: string
|
|
format: date-time
|
|
IdempotencyKey:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 120
|
|
additionalProperties: false
|
|
type: object
|
|
EnrichmentSource:
|
|
description: One cited public web source; no page body or credential data is retained
|
|
required:
|
|
- ID
|
|
- URL
|
|
- RetrievedDate
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
URL:
|
|
type: string
|
|
format: uri
|
|
maxLength: 2048
|
|
Title:
|
|
type: string
|
|
maxLength: 512
|
|
RetrievedDate:
|
|
type: string
|
|
format: date-time
|
|
additionalProperties: false
|
|
type: object
|
|
EnrichmentCandidate:
|
|
description: One allowlisted human-editable field candidate supported by at least one cited source; no model confidence claim is made
|
|
required:
|
|
- ID
|
|
- FieldName
|
|
- ProposedValue
|
|
- Sources
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
FieldName:
|
|
type: string
|
|
pattern: '^(Name|AnnualRevenue|Phone|Website|Description|FullDescription|Industries|Industry|NumberOfEmployees|Location|Email|LinkedIn|Twitter|Facebook|FoundedDate|TagLine|description|enrichmentstatus|fulldescription|imagealttext|imageurl|logo|name|slug|tagline|url)$'
|
|
ProposedValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
Rationale:
|
|
type: string
|
|
maxLength: 2000
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/EnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
EnrichmentRun:
|
|
description: Durable source-backed research evidence; it never represents an authoritative subject write or publication
|
|
required:
|
|
- ID
|
|
- TenantID
|
|
- SubjectType
|
|
- SubjectID
|
|
- BaseVersion
|
|
- Status
|
|
- Provider
|
|
- Model
|
|
- PromptVersion
|
|
- RequestedByID
|
|
- CreatedDate
|
|
- StartedDate
|
|
- Candidates
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
TenantID:
|
|
type: string
|
|
format: uuid
|
|
SubjectType:
|
|
type: string
|
|
enum: [account, company_product, company_service]
|
|
SubjectID:
|
|
type: string
|
|
format: uuid
|
|
BaseVersion:
|
|
type: string
|
|
format: date-time
|
|
Status:
|
|
type: string
|
|
enum: [running, completed, failed]
|
|
Provider:
|
|
type: string
|
|
maxLength: 40
|
|
Model:
|
|
type: string
|
|
maxLength: 80
|
|
PromptVersion:
|
|
type: string
|
|
maxLength: 80
|
|
ProviderResponseID:
|
|
type: string
|
|
maxLength: 120
|
|
FailureCode:
|
|
type: string
|
|
maxLength: 80
|
|
RequestedByID:
|
|
type: string
|
|
format: uuid
|
|
CreatedDate:
|
|
type: string
|
|
format: date-time
|
|
StartedDate:
|
|
type: string
|
|
format: date-time
|
|
CompletedDate:
|
|
type: string
|
|
format: date-time
|
|
Candidates:
|
|
type: array
|
|
maxItems: 16
|
|
items:
|
|
$ref: "#/definitions/EnrichmentCandidate"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentSource:
|
|
description: One immutable public web citation used by portfolio_enrichment.v1; no page body or credential data is retained
|
|
required:
|
|
- ID
|
|
- URL
|
|
- SourceClass
|
|
- RetrievedDate
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
URL:
|
|
type: string
|
|
format: uri
|
|
maxLength: 2048
|
|
SourceClass:
|
|
type: string
|
|
enum: [official, regulatory, independent_reporting, analyst_research, marketplace, other]
|
|
Title:
|
|
type: string
|
|
maxLength: 512
|
|
RetrievedDate:
|
|
type: string
|
|
format: date-time
|
|
Locator:
|
|
type: string
|
|
maxLength: 512
|
|
ExcerptHash:
|
|
type: string
|
|
pattern: '^sha256:[a-f0-9]{64}$'
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentField:
|
|
description: One Research-assembled Product or Service field comparison in portfolio_enrichment.v1
|
|
required:
|
|
- ID
|
|
- FieldName
|
|
- ExistingValueCaptured
|
|
- ProposedValue
|
|
- NormalizedValue
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
FieldName:
|
|
type: string
|
|
pattern: '^(description|fulldescription|imagealttext|imageurl|logo|name|slug|tagline|url)$'
|
|
ExistingValue:
|
|
type: string
|
|
maxLength: 20000
|
|
ExistingValueCaptured:
|
|
type: boolean
|
|
ProposedValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
NormalizedValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentObservedField:
|
|
description: One normalized, cited Product or Service field observation emitted by the non-authoritative worker
|
|
required:
|
|
- FieldName
|
|
- ProposedValue
|
|
- NormalizedValue
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
FieldName:
|
|
type: string
|
|
pattern: '^(description|fulldescription|imagealttext|imageurl|logo|name|slug|tagline|url)$'
|
|
ProposedValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
NormalizedValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentMatchFact:
|
|
description: One deterministic comparison used during reconciliation; it is not a model-confidence score
|
|
required:
|
|
- Rule
|
|
- CandidateValue
|
|
- TargetValue
|
|
- Matched
|
|
properties:
|
|
Rule:
|
|
type: string
|
|
enum: [exact_name_v1, normalized_name_v1, token_sort_name_v1, exact_url_v1, normalized_url_v1, alias_v1]
|
|
CandidateValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 2048
|
|
TargetValue:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 2048
|
|
Matched:
|
|
type: boolean
|
|
TargetID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
Score:
|
|
type: number
|
|
format: double
|
|
minimum: 0
|
|
maximum: 100
|
|
Threshold:
|
|
type: number
|
|
format: double
|
|
minimum: 0
|
|
maximum: 100
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentPotentialMatch:
|
|
description: One unselected authoritative alternative retained for human reconciliation; it never grants write authority
|
|
required:
|
|
- TargetID
|
|
- TargetBaseVersion
|
|
- TargetLabel
|
|
- MatchFacts
|
|
properties:
|
|
TargetID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
TargetBaseVersion:
|
|
type: string
|
|
format: date-time
|
|
TargetLabel:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
MatchFacts:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 24
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentMatchFact"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentInputFact:
|
|
description: One bounded Account input supplied by an authoritative Account snapshot or an operator fact sheet
|
|
required:
|
|
- Name
|
|
- Value
|
|
- SourceType
|
|
properties:
|
|
Name:
|
|
type: string
|
|
pattern: '^[a-z][a-z0-9_]{0,119}$'
|
|
maxLength: 120
|
|
Value:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
SourceType:
|
|
type: string
|
|
enum: [authoritative_account, operator_fact_sheet]
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentInput:
|
|
description: Bounded, non-secret Account context used for one portfolio_enrichment.v1 run
|
|
required:
|
|
- AccountName
|
|
- Facts
|
|
properties:
|
|
AccountName:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
AccountWebsite:
|
|
type: string
|
|
format: uri
|
|
maxLength: 2048
|
|
Facts:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentInputFact"
|
|
FactSheetDigest:
|
|
type: string
|
|
pattern: '^sha256:[a-f0-9]{64}$'
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioOperatorOffering:
|
|
description: One bounded operator-supplied offering lead; Research treats every field as untrusted context and verifies it against public evidence
|
|
required:
|
|
- Name
|
|
properties:
|
|
Name:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
EntityTypeHint:
|
|
type: string
|
|
enum: [company_product, company_service, unspecified]
|
|
Description:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 2000
|
|
URL:
|
|
type: string
|
|
format: uri
|
|
maxLength: 2048
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioOperatorFacts:
|
|
description: Optional bounded portfolio_operator_facts.v1 discovery context; it contains no authority, provider, model, prompt, tenant, or actor controls
|
|
required:
|
|
- ProtocolVersion
|
|
properties:
|
|
ProtocolVersion:
|
|
type: string
|
|
enum: [portfolio_operator_facts.v1]
|
|
CompanyOverview:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 4000
|
|
Offerings:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
$ref: "#/definitions/PortfolioOperatorOffering"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentRunRequest:
|
|
description: Minimal browser-independent request for one Account portfolio research run with optional bounded portfolio_operator_facts.v1 discovery context; Research resolves the authoritative input snapshot and owns the fact digest, fact source, provider, model, prompt, tenant, actor, lifecycle, matching, action, and save-path fields
|
|
required:
|
|
- AccountID
|
|
- AccountBaseVersion
|
|
- IdempotencyKey
|
|
properties:
|
|
AccountID:
|
|
type: string
|
|
format: uuid
|
|
AccountBaseVersion:
|
|
type: string
|
|
format: date-time
|
|
IdempotencyKey:
|
|
type: string
|
|
minLength: 16
|
|
maxLength: 120
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
OperatorFacts:
|
|
$ref: "#/definitions/PortfolioOperatorFacts"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioReconciliationFieldSelection:
|
|
description: One operator-selected value bound to an immutable field in the completed portfolio enrichment run; Research revalidates the field identity, name, value, and entity-specific bounds
|
|
required:
|
|
- CandidateFieldID
|
|
- FieldName
|
|
- Value
|
|
properties:
|
|
CandidateFieldID:
|
|
type: string
|
|
format: uuid
|
|
FieldName:
|
|
type: string
|
|
enum:
|
|
- description
|
|
- fulldescription
|
|
- imagealttext
|
|
- imageurl
|
|
- logo
|
|
- name
|
|
- slug
|
|
- tagline
|
|
- url
|
|
Value:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioReconciliationRequest:
|
|
description: Strict one-candidate Discovery-mode direct create or Service update request. The completed run, tenant, Account, policy, candidate action and save path, source provenance, target identity, versions, attribution, and receipt are server-owned.
|
|
required:
|
|
- Mode
|
|
- Action
|
|
- EntityType
|
|
- CandidateID
|
|
- Fields
|
|
- Acknowledged
|
|
- IdempotencyKey
|
|
properties:
|
|
Mode:
|
|
type: string
|
|
enum: [discovery]
|
|
Action:
|
|
type: string
|
|
enum: [create, update]
|
|
EntityType:
|
|
type: string
|
|
enum: [company_product, company_service]
|
|
CandidateID:
|
|
type: string
|
|
format: uuid
|
|
Fields:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 9
|
|
uniqueItems: true
|
|
items:
|
|
$ref: "#/definitions/PortfolioReconciliationFieldSelection"
|
|
Acknowledged:
|
|
description: Explicit acknowledgement that this operation creates one authoritative Product or Service, or updates one authoritative Service, and appends an immutable receipt
|
|
type: boolean
|
|
enum: [true]
|
|
IdempotencyKey:
|
|
type: string
|
|
minLength: 16
|
|
maxLength: 120
|
|
pattern: '^[A-Za-z0-9._:-]+$'
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioReconciliationReceipt:
|
|
description: Bounded immutable evidence for one Discovery-mode authoritative create or compare-and-swap update. It exposes only safe attribution identifiers and never credentials, request tokens, provider response IDs, source bodies, or policy reasons.
|
|
required:
|
|
- ID
|
|
- RunID
|
|
- CandidateID
|
|
- Mode
|
|
- EntityType
|
|
- Action
|
|
- TargetID
|
|
- TargetResultVersion
|
|
- PolicyRevision
|
|
- ActorUserID
|
|
- ClientPrincipalID
|
|
- ClientPrincipalKey
|
|
- CreatedDate
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
RunID:
|
|
type: string
|
|
format: uuid
|
|
CandidateID:
|
|
type: string
|
|
format: uuid
|
|
Mode:
|
|
type: string
|
|
enum: [discovery]
|
|
EntityType:
|
|
type: string
|
|
enum: [company_product, company_service]
|
|
Action:
|
|
type: string
|
|
enum: [create, update]
|
|
TargetID:
|
|
type: string
|
|
format: uuid
|
|
TargetBeforeVersion:
|
|
description: Exact authoritative version checked before an update; omitted for create
|
|
type: string
|
|
format: date-time
|
|
TargetResultVersion:
|
|
type: string
|
|
format: date-time
|
|
PolicyRevision:
|
|
type: integer
|
|
format: int64
|
|
minimum: 1
|
|
ActorUserID:
|
|
type: string
|
|
format: uuid
|
|
ClientPrincipalID:
|
|
type: string
|
|
format: uuid
|
|
ClientPrincipalKey:
|
|
description: Stable service-principal label, never a credential value
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
pattern: '^[A-Za-z0-9._:-]+$'
|
|
CreatedDate:
|
|
type: string
|
|
format: date-time
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentClassification:
|
|
description: One cited classification label discovered for a Product or Service
|
|
required:
|
|
- Label
|
|
- NormalizedLabel
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
Label:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
NormalizedLabel:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentSummary:
|
|
description: One cited human-readable executive summary for a completed portfolio_enrichment.v1 run
|
|
required:
|
|
- Text
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
Text:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 20000
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentWorkerObservation:
|
|
description: One non-authoritative worker observation; launch and rebrand resolve to a worker candidate while retirement and stale may describe an absent catalog entry
|
|
required:
|
|
- Kind
|
|
- SubjectEntityType
|
|
- SubjectName
|
|
- Summary
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
Kind:
|
|
type: string
|
|
enum: [launch, rebrand, retirement, stale]
|
|
SubjectEntityType:
|
|
type: string
|
|
enum: [company_product, company_service]
|
|
SubjectName:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
WorkerKey:
|
|
type: string
|
|
pattern: '^[a-z0-9][a-z0-9._:-]{0,119}$'
|
|
maxLength: 120
|
|
Summary:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 2000
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentRunObservation:
|
|
description: One Research-assembled launch, rebrand, retirement, or stale-offering observation bound to stable run or authoritative identity
|
|
required:
|
|
- ID
|
|
- Kind
|
|
- SubjectEntityType
|
|
- SubjectName
|
|
- Summary
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
Kind:
|
|
type: string
|
|
enum: [launch, rebrand, retirement, stale]
|
|
SubjectEntityType:
|
|
type: string
|
|
enum: [company_product, company_service]
|
|
SubjectName:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
CandidateID:
|
|
type: string
|
|
format: uuid
|
|
TargetID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
TargetBaseVersion:
|
|
type: string
|
|
format: date-time
|
|
Summary:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 2000
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentQueryEvidence:
|
|
description: One bounded public-web search fact used to derive coverage; the adapter verifies QueryText against the provider web-search trace
|
|
required:
|
|
- ID
|
|
- Purpose
|
|
- QueryText
|
|
- SourceIDs
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
Purpose:
|
|
type: string
|
|
enum: [portfolio_overview, product_catalog, service_catalog, launches_changes, retirements_staleness, classification]
|
|
QueryText:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 512
|
|
SourceIDs:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 50
|
|
uniqueItems: true
|
|
items:
|
|
type: string
|
|
format: uuid
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentRelationshipCandidate:
|
|
description: One deterministic proposed Product-to-Industry or Service-to-Industry relationship; no relationship is applied by the research contract
|
|
required:
|
|
- ID
|
|
- RelationshipType
|
|
- TargetID
|
|
- TargetLabel
|
|
- ExistingRelationshipCaptured
|
|
- ReconciliationAction
|
|
- MatchFacts
|
|
- ObservedDate
|
|
- Sources
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
RelationshipType:
|
|
type: string
|
|
enum: [industry_product, industry_service]
|
|
TargetID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
TargetLabel:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 255
|
|
ExistingRelationshipCaptured:
|
|
description: Research confirmed whether the authoritative junction exists
|
|
type: boolean
|
|
ExistingRelationshipID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
ExistingRelationshipBaseVersion:
|
|
type: string
|
|
format: date-time
|
|
ReconciliationAction:
|
|
type: string
|
|
enum: [create, unchanged, ignore]
|
|
MatchFacts:
|
|
type: array
|
|
maxItems: 24
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentMatchFact"
|
|
ObservedDate:
|
|
type: string
|
|
format: date-time
|
|
Sources:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 12
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentSource"
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentWorkerCoverageClaim:
|
|
description: Non-authoritative completeness claim emitted by the worker; Research recomputes final coverage
|
|
required:
|
|
- ClaimedStatus
|
|
- ProductCount
|
|
- ServiceCount
|
|
- QueryCount
|
|
- SourceCount
|
|
- OmittedReasons
|
|
properties:
|
|
ClaimedStatus:
|
|
type: string
|
|
enum: [complete, partial, insufficient_evidence, truncated]
|
|
ProductCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
ServiceCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
QueryCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
SourceCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
OmittedReasons:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentCoverage:
|
|
description: Research-derived completeness statement for one bounded portfolio research result
|
|
required:
|
|
- Status
|
|
- PolicyVersion
|
|
- ProductCount
|
|
- ServiceCount
|
|
- QueryCount
|
|
- SourceCount
|
|
- UniqueHostCount
|
|
- OmittedReasons
|
|
properties:
|
|
Status:
|
|
type: string
|
|
enum: [complete, partial, insufficient_evidence, truncated]
|
|
PolicyVersion:
|
|
type: string
|
|
enum: [portfolio_coverage.v1]
|
|
ProductCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
ServiceCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
QueryCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
SourceCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
UniqueHostCount:
|
|
type: integer
|
|
format: int64
|
|
minimum: 0
|
|
maximum: 10000
|
|
OmittedReasons:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentWorkerCandidate:
|
|
description: One non-authoritative cited Product or Service observation emitted by the Python worker
|
|
required:
|
|
- WorkerKey
|
|
- EntityType
|
|
- NormalizedName
|
|
- Aliases
|
|
- Fields
|
|
- Classifications
|
|
- Warnings
|
|
properties:
|
|
WorkerKey:
|
|
type: string
|
|
pattern: '^[a-z0-9][a-z0-9._:-]{0,119}$'
|
|
maxLength: 120
|
|
EntityType:
|
|
type: string
|
|
enum: [company_product, company_service]
|
|
NormalizedName:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
NormalizedURL:
|
|
type: string
|
|
format: uri
|
|
maxLength: 255
|
|
Aliases:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
Fields:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 16
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentObservedField"
|
|
Classifications:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentClassification"
|
|
Warnings:
|
|
type: array
|
|
maxItems: 24
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentWorkerResult:
|
|
description: Non-authoritative portfolio_enrichment.v1 evidence emitted by the Python worker; Research owns all run, tenant, actor, target, match, action, and lifecycle state
|
|
required:
|
|
- ProtocolVersion
|
|
- ExecutionMode
|
|
- Disclosure
|
|
- ExecutiveSummary
|
|
- CoverageClaim
|
|
- Queries
|
|
- NoteworthyObservations
|
|
- Products
|
|
- Services
|
|
- Warnings
|
|
properties:
|
|
ProtocolVersion:
|
|
type: string
|
|
enum: [portfolio_enrichment.v1]
|
|
ExecutionMode:
|
|
type: string
|
|
enum: [live, simulation]
|
|
Disclosure:
|
|
type: string
|
|
enum:
|
|
- "Live research evidence: operator review required before any save."
|
|
- "Simulation: operator review required before any save."
|
|
ExecutiveSummary:
|
|
$ref: "#/definitions/PortfolioEnrichmentSummary"
|
|
CoverageClaim:
|
|
$ref: "#/definitions/PortfolioEnrichmentWorkerCoverageClaim"
|
|
Queries:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentQueryEvidence"
|
|
NoteworthyObservations:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentWorkerObservation"
|
|
Products:
|
|
type: array
|
|
maxItems: 250
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentWorkerCandidate"
|
|
Services:
|
|
type: array
|
|
maxItems: 250
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentWorkerCandidate"
|
|
Warnings:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentCandidate:
|
|
description: One human-reviewable Product or Service candidate in portfolio_enrichment.v1; the action remains editable until an independently authorized save
|
|
required:
|
|
- ID
|
|
- WorkerKey
|
|
- EntityType
|
|
- NormalizedName
|
|
- Aliases
|
|
- Fields
|
|
- Classifications
|
|
- MatchFacts
|
|
- PotentialMatches
|
|
- Relationships
|
|
- ReconciliationAction
|
|
- SavePath
|
|
- Warnings
|
|
properties:
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
WorkerKey:
|
|
type: string
|
|
pattern: '^[a-z0-9][a-z0-9._:-]{0,119}$'
|
|
maxLength: 120
|
|
EntityType:
|
|
type: string
|
|
enum: [company_product, company_service]
|
|
TargetID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
TargetBaseVersion:
|
|
type: string
|
|
format: date-time
|
|
NormalizedName:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
NormalizedURL:
|
|
type: string
|
|
format: uri
|
|
maxLength: 255
|
|
Aliases:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
Fields:
|
|
type: array
|
|
minItems: 1
|
|
maxItems: 16
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentField"
|
|
Classifications:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentClassification"
|
|
MatchFacts:
|
|
type: array
|
|
maxItems: 24
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentMatchFact"
|
|
PotentialMatches:
|
|
type: array
|
|
maxItems: 24
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentPotentialMatch"
|
|
Relationships:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentRelationshipCandidate"
|
|
ReconciliationAction:
|
|
type: string
|
|
enum: [create, update, unchanged, possible_duplicate, ignore]
|
|
SavePath:
|
|
description: Server-derived native write boundary for the current reconciliation action; it does not itself authorize or perform a write
|
|
type: string
|
|
enum: [direct_create, direct_update, governed_update_proposal, none]
|
|
Warnings:
|
|
type: array
|
|
maxItems: 24
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
PortfolioEnrichmentRun:
|
|
description: Account-scoped portfolio_enrichment.v1 research result containing Product and Service candidates together; it is immutable evidence and never an authoritative write or publication
|
|
required:
|
|
- ProtocolVersion
|
|
- ID
|
|
- TenantID
|
|
- AccountID
|
|
- AccountBaseVersion
|
|
- Input
|
|
- Status
|
|
- Provider
|
|
- Model
|
|
- PromptVersion
|
|
- ExecutionMode
|
|
- Disclosure
|
|
- RequestedByID
|
|
- CreatedDate
|
|
- StartedDate
|
|
- Coverage
|
|
- Queries
|
|
- NoteworthyObservations
|
|
- Products
|
|
- Services
|
|
- Warnings
|
|
properties:
|
|
ProtocolVersion:
|
|
type: string
|
|
enum: [portfolio_enrichment.v1]
|
|
ID:
|
|
type: string
|
|
format: uuid
|
|
TenantID:
|
|
type: string
|
|
format: uuid
|
|
AccountID:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 64
|
|
pattern: '^[A-Za-z0-9_-]+$'
|
|
AccountBaseVersion:
|
|
type: string
|
|
format: date-time
|
|
Input:
|
|
$ref: "#/definitions/PortfolioEnrichmentInput"
|
|
Status:
|
|
type: string
|
|
enum: [running, completed, failed]
|
|
Provider:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 40
|
|
Model:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
PromptVersion:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 80
|
|
ProviderResponseID:
|
|
type: string
|
|
maxLength: 120
|
|
FailureCode:
|
|
type: string
|
|
maxLength: 80
|
|
ExecutionMode:
|
|
type: string
|
|
enum: [live, simulation]
|
|
Disclosure:
|
|
type: string
|
|
enum:
|
|
- "Live research evidence: operator review required before any save."
|
|
- "Simulation: operator review required before any save."
|
|
RequestedByID:
|
|
type: string
|
|
format: uuid
|
|
CreatedDate:
|
|
type: string
|
|
format: date-time
|
|
StartedDate:
|
|
type: string
|
|
format: date-time
|
|
CompletedDate:
|
|
type: string
|
|
format: date-time
|
|
ExecutiveSummary:
|
|
$ref: "#/definitions/PortfolioEnrichmentSummary"
|
|
Coverage:
|
|
$ref: "#/definitions/PortfolioEnrichmentCoverage"
|
|
Queries:
|
|
type: array
|
|
maxItems: 50
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentQueryEvidence"
|
|
NoteworthyObservations:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentRunObservation"
|
|
Products:
|
|
type: array
|
|
maxItems: 250
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentCandidate"
|
|
Services:
|
|
type: array
|
|
maxItems: 250
|
|
items:
|
|
$ref: "#/definitions/PortfolioEnrichmentCandidate"
|
|
Warnings:
|
|
type: array
|
|
maxItems: 100
|
|
items:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 1000
|
|
additionalProperties: false
|
|
type: object
|
|
DeleteResponse:
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "#/definitions/Message"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
Error:
|
|
$ref: ../../lib/swagger/defs/error.yaml#/Error
|
|
FactorRequest:
|
|
description: An array of Factor objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/factor.yaml#/Factor"
|
|
type: array
|
|
type: object
|
|
FactorResponse:
|
|
description: An array of Factor objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/factor.yaml#/Factor"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
FinancialStatementRequest:
|
|
description: An array of FinancialStatement objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/financial-statement.yaml#/FinancialStatement"
|
|
type: array
|
|
type: object
|
|
FinancialStatementResponse:
|
|
description: An array of FinancialStatement objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/financial-statement.yaml#/FinancialStatement"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
IndustryCompanyRequest:
|
|
description: An array of IndustryCompany objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry-company.yaml#/IndustryCompany"
|
|
type: array
|
|
type: object
|
|
IndustryCompanyResponse:
|
|
description: An array of IndustryCompany objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry-company.yaml#/IndustryCompany"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
IndustryProductRequest:
|
|
description: An array of IndustryProduct objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry-product.yaml#/IndustryProduct"
|
|
type: array
|
|
type: object
|
|
IndustryProductResponse:
|
|
description: An array of IndustryProduct objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry-product.yaml#/IndustryProduct"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
IndustryServiceRequest:
|
|
description: An array of IndustryService objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry-service.yaml#/IndustryService"
|
|
type: array
|
|
type: object
|
|
IndustryServiceResponse:
|
|
description: An array of IndustryService objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry-service.yaml#/IndustryService"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
IndustryRequest:
|
|
description: An array of Industry objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry.yaml#/Industry"
|
|
type: array
|
|
type: object
|
|
IndustryResponse:
|
|
description: An array of Industry objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/industry.yaml#/Industry"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
InvalidError:
|
|
allOf:
|
|
- $ref: "#/definitions/Error"
|
|
- properties:
|
|
details:
|
|
items:
|
|
type: string
|
|
type: array
|
|
type: object
|
|
Message:
|
|
properties:
|
|
message:
|
|
type: string
|
|
ref:
|
|
type: string
|
|
status:
|
|
format: int64
|
|
type: number
|
|
type: object
|
|
ObservationRequest:
|
|
description: An array of Observation objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/observation.yaml#/Observation"
|
|
type: array
|
|
type: object
|
|
ObservationResponse:
|
|
description: An array of Observation objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/observation.yaml#/Observation"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|
|
Pagination:
|
|
properties:
|
|
limit:
|
|
format: int64
|
|
type: number
|
|
pagesize:
|
|
format: int64
|
|
type: number
|
|
poffset:
|
|
format: int64
|
|
type: integer
|
|
setsize:
|
|
format: int64
|
|
type: number
|
|
type: object
|
|
RequestMeta:
|
|
properties:
|
|
ExternalAccount:
|
|
description: Account Number of the Reseller or OEM
|
|
type: string
|
|
required:
|
|
- ExternalAccount
|
|
type: object
|
|
ResponseMeta:
|
|
properties:
|
|
Contact:
|
|
description: Microservice Contact Info
|
|
type: string
|
|
Copyright:
|
|
description: Copyright Info
|
|
type: string
|
|
License:
|
|
description: License Information and Restrictions
|
|
type: string
|
|
OperationID:
|
|
description: Operation ID
|
|
type: string
|
|
Pagination:
|
|
$ref: "#/definitions/Pagination"
|
|
RequestIP:
|
|
description: Request IP Address
|
|
type: string
|
|
RequestType:
|
|
description: Request Type
|
|
type: string
|
|
RequestURL:
|
|
description: Request URL
|
|
type: string
|
|
ServerInfo:
|
|
description: Data Server Info
|
|
type: string
|
|
ServerResponseTime:
|
|
description: Data Server Response Time (ms)
|
|
type: string
|
|
ServerTimestamp:
|
|
description: Backend Server Timestamp
|
|
type: string
|
|
ExternalAccount:
|
|
description: Account Number used for recording transactions
|
|
type: string
|
|
type: object
|
|
TopicRequest:
|
|
description: An array of Topic objects submitted for processing
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/topic.yaml#/Topic"
|
|
type: array
|
|
type: object
|
|
TopicResponse:
|
|
description: An array of Topic objects produced in response to a request
|
|
properties:
|
|
Data:
|
|
items:
|
|
$ref: "../../lib/swagger/defs/topic.yaml#/Topic"
|
|
type: array
|
|
Meta:
|
|
$ref: "#/definitions/ResponseMeta"
|
|
type: object
|