openapi: 3.2.0 info: title: Fenergo Assumptions API version: '1.0' description: 'Operations tagged Assumptions across 2 of this provider''s published API definitions: fenergo-businessmetricscommand-v1-0-0-openapi.json, fenergo-businessmetricsquery-v1-0-openapi.json. Each path carries the servers of the definition it was published in.' servers: - url: /businessmetricscommand - url: /businessmetricsquery security: - Bearer: [] tags: - name: Assumptions paths: /api/assumptions: put: tags: - Assumptions summary: Save or update ROI assumptions for the current tenant description: 'Creates or replaces the tenant-specific ROI assumptions used for agent value calculations Required permissions: Following permissions are required: ValueStoryEdit' parameters: - name: X-TENANT-ID in: header description: The UiD of the tenant representing organization required: true schema: type: string example: b11f8be3-f29b-4959-8964-956d4af7c468 - name: X-CORRELATION-ID in: header description: The UiD of the correlation id schema: type: string example: fee5b5f5-b220-4fef-ba38-bf802b98d74d requestBody: description: Upsert assumptions request content: application/json: schema: allOf: - $ref: '#/components/schemas/UpsertTenantAssumptionsRequestDtoServiceRequest' text/json: schema: allOf: - $ref: '#/components/schemas/UpsertTenantAssumptionsRequestDtoServiceRequest' application/*+json: schema: allOf: - $ref: '#/components/schemas/UpsertTenantAssumptionsRequestDtoServiceRequest' required: true responses: '204': description: Success. Assumptions were saved '400': description: Bad request. The request has missing/invalid values content: text/plain: schema: $ref: '#/components/schemas/ServiceResponse' application/json: schema: $ref: '#/components/schemas/ServiceResponse' text/json: schema: $ref: '#/components/schemas/ServiceResponse' '401': description: User is not authorized to perform this request content: application/json: example: message: Unauthorized '403': description: Access to resource is forbidden. content: application/json: schema: $ref: '#/components/schemas/ObjectServiceResponse' example: data: {} messages: - message: 'Access denied. Following permissions are required: Permission1, Permission2' type: Forbidden errorCode: Error Code '500': description: Internal server exception. Please, contact your provider. content: application/json: schema: $ref: '#/components/schemas/ObjectServiceResponse' example: data: null messages: - message: Internal server exception. Please, contact your provider. type: Error errorCode: INTERNAL_SERVER_ERROR '410': description: Endpoint marked as deprecated was terminated. This response will be present only if the endpoint was marked as deprecated and has reached the sunset date. During the deprecation period, the API will include additional 'sunset' and 'deprecation' headers. content: application/json: schema: $ref: '#/components/schemas/StringServiceResponse' example: data: null messages: - message: This endpoint is obsolete and was terminated on yyyy-MM-dd type: Error errorCode: OBSOLETE_ENDPOINT operationId: putApiAssumptions x-operation-id-source: derived get: tags: - Assumptions summary: Get ROI assumptions for the current tenant description: 'Returns the tenant-specific ROI assumptions used for agent value calculations. Falls back to system defaults when no tenant configuration has been saved. Required permissions: Following permissions are required: ValueStoryAccess' operationId: GetTenantAssumptions parameters: - name: X-TENANT-ID in: header description: The UiD of the tenant representing organization required: true schema: type: string example: b11f8be3-f29b-4959-8964-956d4af7c468 responses: '200': description: Success. Returns the tenant assumptions content: text/plain: schema: $ref: '#/components/schemas/GetTenantAssumptionsResponseDtoServiceResponse' application/json: schema: $ref: '#/components/schemas/GetTenantAssumptionsResponseDtoServiceResponse' text/json: schema: $ref: '#/components/schemas/GetTenantAssumptionsResponseDtoServiceResponse' '500': description: Internal Server Error content: text/plain: schema: $ref: '#/components/schemas/ServiceResponse' application/json: schema: $ref: '#/components/schemas/ServiceResponse' text/json: schema: $ref: '#/components/schemas/ServiceResponse' '401': description: User is not authorized to perform this request content: application/json: example: message: Unauthorized '403': description: Access to resource is forbidden. content: application/json: schema: $ref: '#/components/schemas/ObjectServiceResponse' example: data: {} messages: - message: 'Access denied. Following permissions are required: Permission1, Permission2' type: Forbidden errorCode: Error Code '410': description: Endpoint marked as deprecated was terminated. This response will be present only if the endpoint was marked as deprecated and has reached the sunset date. During the deprecation period, the API will include additional 'sunset' and 'deprecation' headers. content: application/json: schema: $ref: '#/components/schemas/StringServiceResponse' example: data: null messages: - message: This endpoint is obsolete and was terminated on yyyy-MM-dd type: Error errorCode: OBSOLETE_ENDPOINT servers: - url: /businessmetricscommand components: schemas: ServiceResponse: type: object properties: data: type: - string - 'null' messages: type: - array - 'null' items: $ref: '#/components/schemas/ServiceResponseMessage' additionalProperties: false UpsertTenantAssumptionsRequestDtoServiceRequest: type: object properties: data: allOf: - $ref: '#/components/schemas/UpsertTenantAssumptionsRequestDto' additionalProperties: false UpsertTenantAssumptionsRequestDto: type: object properties: hourlyRate: type: number format: double docMinutes: type: integer format: int32 screenMinutes: type: integer format: int32 autoMinutes: type: integer format: int32 reportMinutes: type: integer format: int32 sourceMinutes: type: integer format: int32 policyMinutes: type: integer format: int32 productiveHoursPerMonth: type: integer format: int32 signalMinutes: type: integer format: int32 alertHighScoreThreshold: type: integer format: int32 alertMediumScoreThreshold: type: integer format: int32 onboardingSlaTargetPercent: type: - number - 'null' format: double periodicReviewSlaTargetPercent: type: - number - 'null' format: double maintenanceSlaTargetPercent: type: - number - 'null' format: double annualSubscriptionCost: type: - number - 'null' format: double additionalProperties: false ServiceResponseMessage: type: object properties: message: type: - string - 'null' type: type: - string - 'null' errorCode: type: - string - 'null' additionalProperties: false ObjectServiceResponse: type: object properties: data: {} messages: type: - array - 'null' items: $ref: '#/components/schemas/ServiceResponseMessage' additionalProperties: false StringServiceResponse: type: object properties: data: type: - string - 'null' messages: type: - array - 'null' items: $ref: '#/components/schemas/ServiceResponseMessage' additionalProperties: false GetTenantAssumptionsResponseDtoServiceResponse: type: object properties: data: allOf: - $ref: '#/components/schemas/GetTenantAssumptionsResponseDto' messages: type: - array - 'null' items: $ref: '#/components/schemas/ServiceResponseMessage' additionalProperties: false GetTenantAssumptionsResponseDto: type: object properties: hourlyRate: type: number format: double docMinutes: type: integer format: int32 screenMinutes: type: integer format: int32 autoMinutes: type: integer format: int32 reportMinutes: type: integer format: int32 sourceMinutes: type: integer format: int32 policyMinutes: type: integer format: int32 productiveHoursPerMonth: type: integer format: int32 signalMinutes: type: integer format: int32 alertHighScoreThreshold: type: integer format: int32 alertMediumScoreThreshold: type: integer format: int32 onboardingSlaTargetPercent: type: number format: double periodicReviewSlaTargetPercent: type: number format: double maintenanceSlaTargetPercent: type: number format: double annualHoursAllotment: type: integer format: int32 annualSubscriptionCost: type: - number - 'null' format: double isUsingDefaults: type: boolean annualVolumeCredits: type: integer description: 'The tenant''s total annual volume, in capacity credits, used to derive Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.BandName/Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.CreditsPerEuro/Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.CreditsFloor below. `2_000_000` (the Launch band floor) when the tenant has never set this value.' format: int64 activationDate: type: - string - 'null' description: 'The date the tenant''s current commercial capacity period started. `null` when the tenant has never saved assumptions (AB#547917 AC6) — see `TenantAssumptions.ActivationDate` for the write-time default-on-first-save convention that populates this on save.' format: date bandName: type: - string - 'null' description: 'The name of the capacity band Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.AnnualVolumeCredits resolves to (e.g. "Launch", "Global Reserved Capacity") — derived at read time, never persisted on the tenant record. `null` only if the global band-threshold reference dataset itself is unavailable.' creditsPerEuro: type: - integer - 'null' description: Same derivation source as Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.BandName. format: int32 creditsFloor: type: - integer - 'null' description: Same derivation source as Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.BandName. format: int64 annualPeriodEndDate: type: - string - 'null' description: 'The exclusive upper bound of the tenant''s current annual capacity period — i.e. the start of the next period, not the last day of the current one. Derived at read time as `ActivationDate.Value.AddYears(1)`; `null` when Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.ActivationDate is null (AB#547917 Open Question 5 — naming/convention is cosmetic and was recorded as-is with this XML doc documenting the exclusive semantics, rather than renaming the field).' format: date capacityUnitsPurchased: type: integer description: Gets the tenant's purchased annual entitlement, in capacity credits — same value as Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.AnnualVolumeCredits, alias for naming consistency with `CapacityDto.CapacityUnitsPurchased`. format: int64 entitlementPeriodStart: type: - string - 'null' description: Gets the inclusive start date of the tenant's current entitlement period — same value as Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.ActivationDate, alias for naming consistency with `CapacityDto.EntitlementPeriodStart`. format: date entitlementPeriodEnd: type: - string - 'null' description: Gets the exclusive end date of the tenant's current entitlement period — same value as Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.AnnualPeriodEndDate, alias for naming consistency with `CapacityDto.EntitlementPeriodEnd`. format: date agentActivations: type: - object - 'null' additionalProperties: type: string format: date description: 'Gets each agent''s individual activation date (AB#550218 RD-4, revised per OQ-6), keyed by the canonical agent key (see `Domain.Models.Assumptions.CapacityMeasureCatalog`). Populated from a dedicated per-(tenant, agent) DynamoDB item read (`IAgentActivationRepository.GetAll`), NOT a field on the settings row — an agent absent from this dictionary has no individual activation yet and falls back to Fenergo.Nebula.BusinessMetrics.Query.Application.Queries.Features.GetTenantAssumptions.GetTenantAssumptionsResponseDto.ActivationDate (the tenant-level activation) wherever activation-aware projection is computed. Read-only here: the only writer is EH''s Ops path (`OpsCapacityWriteHandler`, Phase E) — position 1''s "Value Story is read-only for entitlement" contract.' additionalProperties: false securitySchemes: Bearer: type: apiKey description: Please insert JWT with Bearer into field name: Authorization in: header x-refined-from: - fenergo-businessmetricscommand-v1-0-0-openapi.json - fenergo-businessmetricsquery-v1-0-openapi.json