lib/swagger/external/research-vernonkeenan.yaml

3554 lines
104 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:
- "https"
basePath: "/vk/research/v1"
host: "gw.tnxs.net"
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. Existing Product updates remain proposal-only.
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
/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 exactly one authoritative Product or Service, or compare-and-swap update one authoritative 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. Existing Product changes remain governed proposals. 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