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 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