openapi: 3.2.0 info: title: Operations Hub Vis.external Photos API version: 0.1.1 description: '' servers: [] tags: - name: vis.external-photos paths: /api/vis/v1/external-photos/{id}/anomaly/: post: operationId: vis_api_post_external_photo_anomaly summary: Create an anomaly associated with a given external photo ID parameters: - in: path name: id schema: title: Id type: integer required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AnomalyResponse' description: Create an anomaly associated with a given external photo ID. tags: - vis.external-photos requestBody: content: application/json: schema: $ref: '#/components/schemas/AnomalyCreate' required: true security: - APIKeyAuth: [] - CookieAuth: [] components: schemas: AnomalyCustomValueOutput: additionalProperties: false description: Schema for a custom field value in an anomaly response. properties: id: description: Custom value ID title: Id type: integer custom_field_id: description: Customer custom field ID title: Custom Field Id type: integer custom_field_name: description: Field name title: Custom Field Name type: string custom_field_type: description: Field data type title: Custom Field Type type: string value: anyOf: - type: string - type: 'null' description: Value for the field title: Value required: - id - custom_field_id - custom_field_name - custom_field_type title: AnomalyCustomValueOutput type: object AnomalyResponse: additionalProperties: false description: Schema for Anomaly response. properties: updated_at: description: Last update timestamp format: date-time title: Updated At type: string id: description: Anomaly ID title: Id type: integer name: anyOf: - type: string - type: 'null' description: Anomaly name title: Name turbine_id: anyOf: - type: integer - type: 'null' description: Turbine ID title: Turbine Id turbine_component_id: anyOf: - type: integer - type: 'null' description: Turbine component ID title: Turbine Component Id turbine_component_name: anyOf: - type: string - type: 'null' description: Turbine component display name title: Turbine Component Name turbine_component_serial_number: anyOf: - type: string - type: 'null' description: Turbine component serial number title: Turbine Component Serial Number project_id: anyOf: - type: integer - type: 'null' description: Project ID title: Project Id workorder_id: anyOf: - type: integer - type: 'null' description: Work order ID title: Workorder Id service_order_line_id: anyOf: - type: integer - type: 'null' description: Service order line ID title: Service Order Line Id custom_values: description: Client custom field values items: $ref: '#/components/schemas/AnomalyCustomValueOutput' title: Custom Values type: array distance_to_root: description: Distance to root title: Distance To Root type: number max_distance: anyOf: - type: number - type: 'null' description: Max distance title: Max Distance distance_to_leading_edge: anyOf: - type: number - type: 'null' description: Distance to leading edge title: Distance To Leading Edge cross_section_distance: anyOf: - type: number - type: 'null' description: Cross section distance title: Cross Section Distance cross_section_chamber_distance: anyOf: - type: number - type: 'null' description: Cross section chamber distance title: Cross Section Chamber Distance width: anyOf: - type: number - type: 'null' description: Width title: Width profile_depth_from: anyOf: - type: number - type: 'null' description: Profile depth from title: Profile Depth From profile_depth_to: anyOf: - type: number - type: 'null' description: Profile depth to title: Profile Depth To severity: anyOf: - type: string - type: 'null' description: Severity level title: Severity status: description: Status title: Status type: string stage: description: Stage title: Stage type: string resolution_status: anyOf: - type: string - type: 'null' description: Resolution status (derived from stage) title: Resolution Status internal_external: description: Internal/External classification title: Internal External type: string side: anyOf: - type: string - type: 'null' description: Side classification title: Side cross_section_side: anyOf: - type: string - type: 'null' description: Cross section side title: Cross Section Side cross_section_type: description: Cross section type title: Cross Section Type type: string rib: anyOf: - type: string - type: 'null' description: Rib classification title: Rib anomaly_type_id: anyOf: - type: integer - type: 'null' description: Anomaly type ID title: Anomaly Type Id anomaly_type_name: anyOf: - type: string - type: 'null' description: Anomaly type name title: Anomaly Type Name anomaly_sub_type_id: anyOf: - type: integer - type: 'null' description: Anomaly sub-type ID title: Anomaly Sub Type Id anomaly_sub_type_name: anyOf: - type: string - type: 'null' description: Anomaly sub-type name title: Anomaly Sub Type Name anomaly_major_component_id: anyOf: - type: integer - type: 'null' description: Major component ID title: Anomaly Major Component Id anomaly_major_component_name: anyOf: - type: string - type: 'null' description: Major component name title: Anomaly Major Component Name anomaly_component_id: anyOf: - type: integer - type: 'null' description: Component ID title: Anomaly Component Id anomaly_component_name: anyOf: - type: string - type: 'null' description: Component name title: Anomaly Component Name anomaly_sub_component_id: anyOf: - type: integer - type: 'null' description: Sub-component ID title: Anomaly Sub Component Id anomaly_sub_component_name: anyOf: - type: string - type: 'null' description: Sub-component name title: Anomaly Sub Component Name anomaly_material_id: anyOf: - type: integer - type: 'null' description: Material ID title: Anomaly Material Id anomaly_material_name: anyOf: - type: string - type: 'null' description: Anomaly material name title: Anomaly Material Name parent_type_id: anyOf: - type: integer - type: 'null' description: Parent type ID title: Parent Type Id root_cause_id: anyOf: - type: integer - type: 'null' description: Root cause ID title: Root Cause Id root_cause_name: anyOf: - type: string - type: 'null' description: Root cause name title: Root Cause Name main_image_url: anyOf: - type: string - type: 'null' description: URL of anomaly main image proxy endpoint title: Main Image Url client_status: anyOf: - type: string - type: 'null' description: Client status title: Client Status chargeable: anyOf: - type: boolean - type: 'null' description: Whether the anomaly is chargeable title: Chargeable description: anyOf: - type: string - type: 'null' description: Anomaly description title: Description comments: anyOf: - type: string - type: 'null' description: Comments title: Comments service_provider_id: anyOf: - type: integer - type: 'null' description: Service provider ID title: Service Provider Id damage_cause: anyOf: - type: string - type: 'null' description: Damage cause title: Damage Cause parent_anomaly_id: anyOf: - type: integer - type: 'null' deprecated: true description: 'Deprecated: No longer used. Use link_group instead.' title: Parent Anomaly Id cross_file_ids: anyOf: - type: object - items: {} type: array - type: 'null' description: Cross file IDs as JSON title: Cross File Ids video_timestamp_ms: anyOf: - type: integer - type: 'null' description: Video timestamp in milliseconds title: Video Timestamp Ms link_group: anyOf: - type: string - type: 'null' description: Link group title: Link Group registered_by: description: Registered by title: Registered By type: string registered_by_user: anyOf: - type: string - type: 'null' description: Email/username of user who registered anomaly title: Registered By User registration_origin: anyOf: - type: string - type: 'null' description: Registration origin title: Registration Origin width_difference_since_previous: anyOf: - type: number - type: 'null' description: Width difference since previous title: Width Difference Since Previous width_difference_since_oldest: anyOf: - type: number - type: 'null' description: Width difference since oldest title: Width Difference Since Oldest length_difference_since_previous: anyOf: - type: number - type: 'null' description: Length difference since previous title: Length Difference Since Previous length_difference_since_oldest: anyOf: - type: number - type: 'null' description: Length difference since oldest title: Length Difference Since Oldest source_object_id: anyOf: - type: integer - type: 'null' description: ID of inspection file from which this anomaly is created from title: Source Object Id source_object_type_id: anyOf: - type: integer - type: 'null' description: Type of source object (e.g., 'inspection_file') title: Source Object Type Id video_frame: anyOf: - type: integer - type: 'null' description: Video frame number where this anomaly is located title: Video Frame qr_code: anyOf: - type: integer - type: 'null' description: Data extracted from QR code if applicable title: Qr Code segmentation: anyOf: - type: string - type: 'null' description: Segmentation data as JSON (e.g., polygon coordinates) title: Segmentation segmentation_version: anyOf: - type: integer - type: 'null' description: Version of the segmentation data format title: Segmentation Version unity_details: anyOf: - type: object - type: 'null' description: Additional details from Unity analysis as JSON title: Unity Details bbox: anyOf: - type: string - type: 'null' description: Bounding box as JSON string title: Bbox ai_anomaly_id: anyOf: - type: integer - type: 'null' description: ID of associated AI-detected anomaly if applicable title: Ai Anomaly Id ai_status: anyOf: - type: string - type: 'null' description: Status of AI detection title: Ai Status ai_confidence: anyOf: - type: number - type: 'null' description: Confidence score from AI detection title: Ai Confidence ai_images_v2: anyOf: - type: boolean - type: 'null' description: Whether the AI anomaly was imported from the JSON image reference format title: Ai Images V2 frame_blob_path: anyOf: - type: string - type: 'null' description: GCS path to the raw uncropped video frame this anomaly was detected in title: Frame Blob Path required: - updated_at - id - distance_to_root - status - stage - internal_external - cross_section_type - registered_by title: AnomalyResponse type: object AnomalyCreate: additionalProperties: false description: Schema for creating Anomaly. properties: name: anyOf: - type: string - type: 'null' description: Anomaly name title: Name turbine_id: anyOf: - type: integer - type: 'null' description: Turbine ID title: Turbine Id turbine_component_id: anyOf: - type: integer - type: 'null' description: Turbine component ID title: Turbine Component Id turbine_component_serial_number: anyOf: - type: string - type: 'null' description: Turbine component serial number title: Turbine Component Serial Number project_id: anyOf: - type: integer - type: 'null' description: Project ID title: Project Id workorder_id: anyOf: - type: integer - type: 'null' description: Work order ID title: Workorder Id service_order_line_id: anyOf: - type: integer - type: 'null' description: Service order line ID title: Service Order Line Id custom_values: anyOf: - items: $ref: '#/components/schemas/AnomalyCustomValueInput' type: array - type: 'null' description: Client custom field values to set on the anomaly title: Custom Values distance_to_root: description: Distance to root title: Distance To Root type: number max_distance: anyOf: - type: number - type: 'null' description: Max distance title: Max Distance distance_to_leading_edge: anyOf: - type: number - type: 'null' description: Distance to leading edge title: Distance To Leading Edge cross_section_distance: anyOf: - type: number - type: 'null' description: Cross section distance title: Cross Section Distance cross_section_chamber_distance: anyOf: - type: number - type: 'null' description: Cross section chamber distance title: Cross Section Chamber Distance width: anyOf: - type: number - type: 'null' description: Width title: Width profile_depth_from: anyOf: - type: number - type: 'null' description: Profile depth from title: Profile Depth From profile_depth_to: anyOf: - type: number - type: 'null' description: Profile depth to title: Profile Depth To severity: anyOf: - enum: - LEVEL_0 - LEVEL_1 - LEVEL_2 - LEVEL_3 - LEVEL_4 - LEVEL_5 type: string - type: 'null' description: Severity level title: Severity status: default: NEW description: Status title: Status type: string stage: default: RELEASED description: Stage title: Stage type: string internal_external: description: Internal/External classification title: Internal External type: string side: anyOf: - type: string - type: 'null' description: Side classification title: Side cross_section_side: anyOf: - type: string - type: 'null' description: Cross section side title: Cross Section Side cross_section_type: default: DOUBLE_SHEAR_WEB description: Cross section type title: Cross Section Type type: string rib: anyOf: - type: string - type: 'null' description: Rib classification title: Rib anomaly_type_id: anyOf: - type: integer - type: 'null' description: Anomaly type ID title: Anomaly Type Id anomaly_sub_type_id: anyOf: - type: integer - type: 'null' description: Anomaly sub-type ID title: Anomaly Sub Type Id anomaly_major_component_id: anyOf: - type: integer - type: 'null' description: Major component ID title: Anomaly Major Component Id anomaly_component_id: anyOf: - type: integer - type: 'null' description: Component ID title: Anomaly Component Id anomaly_sub_component_id: anyOf: - type: integer - type: 'null' description: Sub-component ID title: Anomaly Sub Component Id anomaly_material_id: anyOf: - type: integer - type: 'null' description: Material ID title: Anomaly Material Id parent_type_id: anyOf: - type: integer - type: 'null' description: Parent type ID title: Parent Type Id root_cause_id: anyOf: - type: integer - type: 'null' description: Root cause ID title: Root Cause Id client_status: anyOf: - type: string - type: 'null' description: Client status title: Client Status chargeable: anyOf: - type: boolean - type: 'null' description: Whether the anomaly is chargeable title: Chargeable description: anyOf: - type: string - type: 'null' description: Anomaly description title: Description comments: anyOf: - type: string - type: 'null' description: Comments title: Comments service_provider_id: anyOf: - type: integer - type: 'null' description: Service provider ID title: Service Provider Id damage_cause: anyOf: - type: string - type: 'null' description: Damage cause title: Damage Cause parent_anomaly_id: anyOf: - type: integer - type: 'null' deprecated: true description: 'Deprecated: No longer used. Use link_group instead.' title: Parent Anomaly Id cross_file_ids: anyOf: - type: object - items: {} type: array - type: 'null' description: Cross file IDs as JSON title: Cross File Ids video_timestamp_ms: anyOf: - type: integer - type: 'null' description: Video timestamp in milliseconds title: Video Timestamp Ms frame_blob_path: anyOf: - type: string - type: 'null' description: GCS path to the raw uncropped video frame this anomaly was detected in title: Frame Blob Path link_group: anyOf: - type: string - type: 'null' description: Link group title: Link Group registered_by: default: AERONES description: Registered by title: Registered By type: string registration_origin: anyOf: - type: string - type: 'null' description: Registration origin title: Registration Origin width_difference_since_previous: anyOf: - type: number - type: 'null' description: Width difference since previous title: Width Difference Since Previous width_difference_since_oldest: anyOf: - type: number - type: 'null' description: Width difference since oldest title: Width Difference Since Oldest length_difference_since_previous: anyOf: - type: number - type: 'null' description: Length difference since previous title: Length Difference Since Previous length_difference_since_oldest: anyOf: - type: number - type: 'null' description: Length difference since oldest title: Length Difference Since Oldest source_object: anyOf: - {} - type: 'null' description: Inspection data file reference title: Source Object video_frame: anyOf: - type: integer - type: 'null' description: Video frame number where this anomaly is located title: Video Frame segmentation: anyOf: - type: string - type: 'null' description: Segmentation data as JSON (e.g., polygon coordinates) title: Segmentation segmentation_version: anyOf: - type: integer - type: 'null' description: Version of the segmentation data format (defaults to 2 when omitted) title: Segmentation Version bbox: anyOf: - type: string - type: 'null' description: Bounding box as JSON string title: Bbox ai_status: anyOf: - enum: - NEW - QUALIFIED - UNQUALIFIED - CONFIRMED - REJECTED - DUPLICATE type: string - type: 'null' description: Status of AI detection title: Ai Status ai_confidence: anyOf: - type: number - type: 'null' description: Confidence score from AI detection title: Ai Confidence ai_images_v2: anyOf: - type: boolean - type: 'null' description: Whether the AI anomaly was imported from the JSON image reference format title: Ai Images V2 required: - distance_to_root - internal_external title: AnomalyCreate type: object AnomalyCustomValueInput: additionalProperties: false description: Schema for setting one custom field value on an anomaly. properties: custom_field_id: description: Customer custom field ID title: Custom Field Id type: integer value: anyOf: - type: string - type: 'null' description: Value for the field. Null or empty clears it. title: Value required: - custom_field_id title: AnomalyCustomValueInput type: object securitySchemes: APIKeyAuth: type: http scheme: bearer CookieAuth: type: apiKey in: cookie name: opshub_prod_sessionid AuthBearer: type: http scheme: bearer