### GraphQL Response for Successful 'Build All' Submission Source: https://developers.hover.to/docs/triggering-build-all-for-blueprint-uploads-via-gql This is an example of a successful response from the Hover API after submitting a 'Build All' blueprint job. It includes details about the created submission, such as its ID, name, organization ID, and current processing state. ```json { "data": { "createBlueprintSubmission": { "createdAt": "2024-04-03T12:00:00Z", "id": "123456", "name": "resuableblueprint_plan_to_test", "orgId": "78910", "state": "PROCESSING", "userId": "user_9876", "__typename": "BlueprintSubmission" } } } ``` -------------------------------- ### CSS API Intro Paragraph Styling Source: https://developers.hover.to/docs/welcome Styles the introductory paragraph section for API documentation. It sets font size, line height, color, and max width for readability, and styles links for consistency. ```css .api-intro-paragraph-section { padding-bottom: 20px; } .api-intro-paragraph-section p { font-size: 1.15em; line-height: 1.65; color: var(--text-color-secondary); max-width: 900px; margin: 0; } .api-intro-paragraph-section p strong { color: var(--text-color-primary); } .api-intro-paragraph-section a { color: var(--link-color); text-decoration: none; transition: color 0.2s ease-in-out; } .api-intro-paragraph-section a:hover { text-decoration: underline; } ``` -------------------------------- ### Obtaining an Authorization Code Source: https://developers.hover.to/docs/oauth-20-authentication Redirect the user to the authorization server to obtain an authorization code. This is a GET request to the `/oauth/authorize` endpoint with specific query parameters. ```APIDOC ## GET /oauth/authorize ### Description Initiates the OAuth 2.0 flow by redirecting the user to Hover's authorization server to grant your application access. ### Method GET ### Endpoint `https://hover.to/oauth/authorize` ### Query Parameters - **client_id** (string) - Required - Your application's Client ID. - **redirect_uri** (string) - Required - Your application's registered redirect URI. - **response_type** (string) - Required - Must be set to `code`. ### Request Example `https://hover.to/oauth/authorize?response_type=code&redirect_uri=https://hover.to&client_id=123456789` ### Response Upon successful user authentication and consent, the user's browser will be redirected to your `redirect_uri` with an authorization code as a query parameter. ``` -------------------------------- ### Simulate Complete Job State - Hover API Source: https://developers.hover.to/docs/testing-your-integration This snippet demonstrates how to set a job to a 'complete' state in the Hover API. This simulates a successful job, returning webhooks and sample property data. Requires job_id and current_user_id. ```http PATCH https://hover.to/api/v2/jobs/{job_id}/set_test_state.json?state=complete¤t_user_id={current_user_id} ``` -------------------------------- ### GET /api/v3/jobs/{job_id} Source: https://developers.hover.to/docs/multi-structure-workflow-for-integrations Retrieves detailed information about a specific job, including property details, capture session data, and model-level deliverables, exports, and images. ```APIDOC ## GET /api/v3/jobs/{job_id} ### Description Retrieves detailed information about a specific job, including property details, capture session data, and model-level deliverables, exports, and images. ### Method GET ### Endpoint `/api/v3/jobs/{job_id}` ### Parameters #### Path Parameters - **job_id** (string) - Required - The unique identifier for the job. ### Response #### Success Response (200) - **general_property_information** (object) - High-level job details such as address and external identifier. - **capture_session_information** (object) - Details about the capture session, including the user and capture type. - **model_data** (array) - An array of objects, each representing a captured structure or level, including model name, deliverable, state, and links to the 3D model, deliverables, artifacts, and images. #### Response Example { "general_property_information": { "address": "123 Main St", "external_identifier": "JOB-XYZ" }, "capture_session_information": { "capturer_user_id": "user-123", "deliverable_type": "Complete (3)" }, "model_data": [ { "model_name": "Exterior", "deliverable": "Complete (3)", "model_state": "processed", "hover_3d_model_link": "https://hover.to/models/123", "deliverables_link": "https://hover.to/deliverables/123", "images_link": "https://hover.to/images/123" } ] } ``` -------------------------------- ### POST /download/job/measurements Source: https://developers.hover.to/docs/download-job-measurements-as-a-file Obtains the Measurements File for a given job in various formats. Requires a job ID and specific user permissions. ```APIDOC ## POST /download/job/measurements ### Description This endpoint allows you to download the measurements file for a specified job. The file can be obtained in multiple formats including PDF, JSON, XML, XLSX, and ESX. ### Method POST ### Endpoint `/download/job/measurements` ### Parameters #### Request Body - **fileType** (string) - Required - The desired format for the measurements file (e.g., 'pdf', 'json', 'xml', 'xlsx', 'esx'). - **jobId** (string) - Required - The ID of the job for which to download measurements. - **userEmail** (string) - Required - The email of the user making the request. This user must be a Hover admin or have access to the specified job ID. ### Request Example ```json { "fileType": "pdf", "jobId": "example_job_id", "userEmail": "admin@hover.com" } ``` ### Response #### Success Response (200) - **fileName** (string) - The name of the downloaded file. - **fileType** (string) - The format of the downloaded file. - **deliverable** (string) - The type of deliverable (e.g., 'Roof Only'). - **name** (string) - The name associated with the job. - **address** (string) - The address associated with the job. - **city** (string) - The city associated with the job. - **region** (string) - The region or state associated with the job. - **postalCode** (string) - The postal code associated with the job. - **country** (string or null) - The country associated with the job. - **capturingUserEmail** (string) - The email of the user who captured the data. - **capturingUserName** (string) - The name of the user who captured the data. - **file** (string) - A data URI or similar representation of the file content. #### Response Example ```json { "fileName": "HOVER_Roof Only_Measurements.pdf", "fileType": "pdf", "deliverable": "Roof Only", "name": "Cool New Home", "address": "20 Cool Drive", "city": "New York City", "region": "NY", "postalCode": "12345", "country": null, "capturingUserEmail": "bob@company.com", "capturingUserName": "morgan@capture.com", "file": "hydrate|||.eJxdkE9PwzAMxb8K8pWqWdutRZUQcBjiApN24FplibtmJHGVPxvTtO9O2u3EzXp-_tnPFxBkA9rQhfOI0MIbZKCsD9wK7JSEdlkv6lX1VGQgog9kokc3N4qmaupyWWbAhaCYEJNaV0VVr5oMeoVadpabiSrx2PVKY4L_nLjbe2gvcN941w2GgRIAhrN0PJDzuaST1cTl-82xi1amIk1GpydjCKNvGRvoiC4PxPio2LFkB9p5VhSLumzKihnkPjo0KaPPR9m_iOjcFHgOgoYr_SxU0FyrxwM3Cn0yk0St7P51RisrckEGsvnU9W96l1dk0wUJd1e_bjk_Nt_rbbcl6h82Vp-7z3_L4Xq9_gEK6H_N:1s7eIN:LLbsFGmn|||hydrate" } ``` ``` -------------------------------- ### GET Capture Request Link Source: https://developers.hover.to/docs/retrieving-capture-request-links Retrieve a specific Capture Request Link using its unique identifier. The response is returned in HTML format containing the link in an `href` tag, or via the 'Location' header. ```APIDOC ## GET /api/v2/capture_requests/ ### Description Retrieves the unique Capture Request Link for a given capture request identifier. ### Method GET ### Endpoint `/api/v2/capture_requests/` ### Parameters #### Path Parameters - **capture_request_identifier** (string) - Required - The unique identifier of the Capture Request. #### Query Parameters None #### Request Body None ### Request Example ``` GET /api/v2/capture_requests/a1b2c3d4-e5f6-7890-1234-567890abcdef ``` ### Response #### Success Response (200) - **html_content** (string) - The HTML content containing the Capture Request Link in an `href` tag. #### Response Example ```html Capture Request Link Go to Capture Request ``` #### Headers - **Location** (string) - The Capture Request Link (alternative to response body). ``` -------------------------------- ### Inspection Checklist Updated Webhook Event Example Source: https://developers.hover.to/docs/hovers-available-webhooks This JSON payload indicates a webhook event when an existing inspection checklist is updated. It includes the event type and identifiers for the checklist and the job. This event type is deprecated. ```json { "event": "inspection-checklist-updated", "inspection_checklist_id": 573, "job_id": 333 } ``` -------------------------------- ### Sample JSON Response for Job Measurements Source: https://developers.hover.to/docs/download-job-measurements-as-a-file This JSON object represents the data returned after successfully downloading job measurements. It includes file details, job information, and a base64 encoded file content. ```json { "fileName": "HOVER_Roof Only_Measurements.pdf", "fileType": "pdf", "deliverable": "Roof Only", "name": "Cool New Home", "address": "20 Cool Drive", "city": "New York City", "region": "NY", "postalCode": "12345", "country": null, "capturingUserEmail": "bob@company.com", "capturingUserName": "morgan@capture.com", "file": "hydrate|||.eJxdkE9PwzAMxb8K8pWqWdutRZUQcBjiApN24FplibtmJHGVPxvTtO9O2u3EzXp-_tnPFxBkA9rQhfOI0MIbZKCsD9wK7JSEdlkv6lX1VGQgog9kokc3N4qmaupyWWbAhaCYEJNaV0VVr5oMeoVadpabiSrx2PVKY4L_nLjbe2gvcN941w2GgRIAhrN0PJDzuaST1cTl-82xi1amIk1GpydjCKNvGRvoiC4PxPio2LFkB9p5VhSLumzKihnkPjo0KaPPR9m_iOjcFHgOgoYr_SxU0FyrxwM3Cn0yk0St7P51RisrckEGsvnU9W96l1dk0wUJd1e_bjk_Nt_rbbcl6h82Vp-7z3_L4Xq9_gEK6H_N:1s7eIN:LLbsFGmn|||hydrate" } ``` -------------------------------- ### Inspection Checklist Created Webhook Event Example Source: https://developers.hover.to/docs/hovers-available-webhooks This JSON payload signifies a webhook event when a new inspection checklist is created. It contains the event type and identifiers for the checklist and the associated job. This event type is deprecated. ```json { "event": "inspection-checklist-created", "inspection_checklist_id": 573, "job_id": 333 } ``` -------------------------------- ### GraphQL Mutation for 'Build All' Blueprint Submission Source: https://developers.hover.to/docs/triggering-build-all-for-blueprint-uploads-via-gql This GraphQL mutation enables the submission of blueprint files to Hover's API with the 'buildAll' flag set to true. It requires file attachment details and an optional job configuration. The mutation returns metadata about the created blueprint submission. ```graphql mutation CreateBlueprintSubmission( $fileAttachmentsAttributes: [FileAttachmentArgs!]!, $jobsAttributes: [JobCreateArgs!], $name: String, $buildAll: Boolean ) { createBlueprintSubmission( fileAttachmentsAttributes: $fileAttachmentsAttributes, name: $name, jobsAttributes: $jobsAttributes, buildAll: $buildAll ) { createdAt id name orgId state userId __typename } } ``` -------------------------------- ### Job State Changed Webhook Event Example Source: https://developers.hover.to/docs/hovers-available-webhooks This JSON payload represents a webhook event triggered when a job's state changes. It includes event details, job identifiers, the new state, and estimated completion time. It is recommended to use the `job-state-changed-v2` events instead. ```json { "event": "job-state-changed", "webhook_id": 230293, "job_external_identifier": "order01239181", "job_id": 19402492, "state": "processing_upload", "content-available": 1, "job_estimated_hours_to_completion": 1.3902 } ``` -------------------------------- ### GraphQL Mutation: Create Blueprint Submission Source: https://developers.hover.to/docs/triggering-build-all-for-blueprint-uploads-via-gql This GraphQL mutation allows you to submit a blueprint file and initiate a 'Build All' job, processing all variations within the blueprint plan. ```APIDOC ## POST /graphql ### Description Submits a blueprint file and triggers a 'Build All' job to process all variations within the blueprint plan. This endpoint uses a GraphQL mutation. ### Method POST ### Endpoint `https://graph.hover.to/graphql` ### Parameters #### Request Body (GraphQL Mutation) ```graphql mutation CreateBlueprintSubmission( $fileAttachmentsAttributes: [FileAttachmentArgs!]!, $jobsAttributes: [JobCreateArgs!], $name: String, $buildAll: Boolean ) { createBlueprintSubmission( fileAttachmentsAttributes: $fileAttachmentsAttributes name: $name jobsAttributes: $jobsAttributes buildAll: $buildAll ) { createdAt id name orgId state userId __typename } } ``` ### Variables (Example) ```json { "fileAttachmentsAttributes": [ { "provider": "FileStack", "url": "https://myURL.com/myfile", "filename": "resuable_blueprint_plan_to_test.pdf", "mimetype": "application/pdf", "size": 5679689 } ], "buildAll": true, "name": "resuableblueprint_plan_to_test" } ``` #### Explanation of Variables * `fileAttachmentsAttributes` (Array of Objects) - Required: An array of file attributes, including the file provider (e.g., FileStack), URL, filename, MIME type, and file size. * `buildAll` (Boolean) - Required: Set to `true` to process all blueprints within the file, `false` to process a single blueprint. * `name` (String) - Required: The name of the blueprint submission. * `jobsAttributes` (Array of Objects) - Optional: If specified, allows creating jobs along with the blueprint submission. ### Response #### Success Response (200 OK) ```json { "data": { "createBlueprintSubmission": { "createdAt": "2024-04-03T12:00:00Z", "id": "123456", "name": "resuableblueprint_plan_to_test", "orgId": "78910", "state": "PROCESSING", "userId": "user_9876", "__typename": "BlueprintSubmission" } } } ``` #### Explanation of Response Fields * `createdAt` (String) - Timestamp when the submission was created. * `id` (String) - Unique identifier for the blueprint submission. * `name` (String) - Name assigned to the submission. * `orgId` (String) - Organization ID associated with the submission. * `state` (String) - Current state of the submission (e.g., `PROCESSING`, `COMPLETED`, `FAILED`). * `userId` (String) - The ID of the user who initiated the request. * `__typename` (String) - GraphQL type name. ``` -------------------------------- ### JSON Variables for 'Build All' Blueprint Submission Source: https://developers.hover.to/docs/triggering-build-all-for-blueprint-uploads-via-gql This JSON object defines the variables required for the `CreateBlueprintSubmission` GraphQL mutation. It includes an array of file attachment attributes and sets the `buildAll` flag to true. ```json { "fileAttachmentsAttributes": [ { "provider": "FileStack", "url": "https://myURL.com/myfile", "filename": "resuable_blueprint_plan_to_test.pdf", "mimetype": "application/pdf", "size": 5679689 } ], "buildAll": true, "name": "resuableblueprint_plan_to_test" } ``` -------------------------------- ### POST /api/v2/capture_requests Source: https://developers.hover.to/docs/capture-requests-via-the-api Initiates a property capture request by creating a draft job in Hover and sending a notification to the capturing user. This endpoint is crucial for integrating Hover's capture workflow into external systems like CRMs. ```APIDOC ## POST /api/v2/capture_requests ### Description Sends a POST request to the Capture Request endpoint to trigger a property capture. This action creates a draft job in your Hover account and sends a notification (email or SMS) to the designated capturing user, prompting them to download the Hover app and capture the specified structure. All Hover captures must be performed on a mobile device. ### Method POST ### Endpoint `https://hover.to/api/v2/capture_requests` ### Parameters #### Request Body - **capture_request[capturing_user_name]** (string) - Required - The name of the user who will perform the capture. - **capture_request[capturing_user_email]** (string) - Required - The email address of the user who will perform the capture. - **capture_request[capturing_user_phone]** (string) - Optional - The phone number of the user. Required if SMS notifications are desired. - **capture_request[job_attributes][location_line_1]** (string) - Required - The primary address line for the property to be captured. - **current_user_email** (string) - Required - The email address of the current user initiating the request. - **current_user_id** (string) - Required - The ID of the current user initiating the request (use either `current_user_email` or `current_user_id`). *Note: Additional attributes can be passed within `capture_request[job_attributes]` to pre-fill job details, reducing manual entry for the capturing user.* ### Request Example ```json { "capture_request": { "capturing_user_name": "Jane Doe", "capturing_user_email": "jane.doe@example.com", "capturing_user_phone": "+15551234567", "job_attributes": { "location_line_1": "123 Main St", "location_city": "Anytown", "location_state": "CA", "location_zip": "90210" } }, "current_user_email": "api_user@example.com" } ``` ### Response #### Success Response (200) - **capture_request_id** (string) - The unique identifier for the created capture request. - **capture_link** (string) - A direct link to initiate the capture process (useful for custom communication). - **status** (string) - The initial status of the capture request (e.g., 'new', 'connected'). #### Response Example ```json { "capture_request_id": "cr_a1b2c3d4e5f6", "capture_link": "https://hover.to/capture/cr_a1b2c3d4e5f6", "status": "new" } ``` #### Error Response (e.g., 400 Bad Request) - **error** (string) - A message describing the error. #### Error Response Example ```json { "error": "Missing required parameter: capture_request[capturing_user_email]" } ``` ``` -------------------------------- ### Multi-Structure Test Jobs API Source: https://developers.hover.to/docs/testing-your-integration This endpoint simulates jobs with multiple associated models, primarily for exterior data, to test integration capabilities for multi-level properties. It's a one-step POST request that creates a sample job within your authenticated organization. ```APIDOC ## POST /test-jobs/multi-structure ### Description Simulates a job with multiple associated models, primarily returning exterior data. Useful for testing multi-level property scenarios and ensuring your integration can handle multiple models within a single job. ### Method POST ### Endpoint /test-jobs/multi-structure ### Parameters #### Query Parameters - **state** (string) - Optional - Determines the final reconstruction state of the test job. Accepted values: `complete`, `failed`. - **failed_models_count** (integer) - Optional - Specifies the number of failed models associated with the job. Accepted values: `0`, `1`, `2`. ### Request Body This endpoint does not require a request body. The `state` and `failed_models_count` are passed as query parameters. ### Request Example ```json { "message": "No request body needed" } ``` ### Response #### Success Response (200) Returns sample deliverables for a simulated job, including: - Exterior Images - Exterior JSON measurements (`full_json` and `summarized_json`) - Exterior Measurements PDF - XLSX Measurements #### Response Example ```json { "job_id": "sample_job_id", "reconstruction_state": "complete", "models": [ { "model_id": "sample_model_id_1", "state": "complete" }, { "model_id": "sample_model_id_2", "state": "complete" } ], "deliverables": { "exterior_images": "/path/to/exterior_images.zip", "exterior_json_measurements": "/path/to/exterior_measurements.json", "exterior_measurements_pdf": "/path/to/exterior_measurements.pdf", "xlsx_measurements": "/path/to/measurements.xlsx" } } ``` ``` -------------------------------- ### CSS Quick Links (Bento Boxes) Section Styling Source: https://developers.hover.to/docs/welcome Styles the 'Quick Links' section using a flexbox layout for a responsive grid of cards (bento boxes). It includes styling for the container, individual cards with shadows, rounded corners, and hover effects. ```css .quick-links-section h2 { border-bottom: 2px solid var(--border-color-light); padding-bottom: 10px; } .container { display: flex; flex-wrap: wrap; gap: 20px; padding: 0px; box-sizing: border-box; justify-content: flex-start; } .card { flex: 1 0 calc(50% - 10px); min-width: 300px; padding: 20px; box-shadow: 0 4px 8px var(--shadow-color); border-radius: 10px; box-sizing: border-box; text-align: left; transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; cursor: pointer; background-color: ``` -------------------------------- ### Simulate Failed Job State - Hover API Source: https://developers.hover.to/docs/testing-your-integration This snippet demonstrates how to set a job to a 'failed' state in the Hover API. This simulates a job failure, triggering a 'failed' webhook event. Requires job_id and current_user_id. No sample data is returned. ```http PATCH https://hover.to/api/v2/jobs/{job_id}/set_test_state.json?state=failed¤t_user_id={current_user_id} ``` -------------------------------- ### Hover Deliverable Types Source: https://developers.hover.to/docs/understanding-deliverable-types This section details the available deliverable types and their corresponding integer IDs. These IDs are used when creating jobs or capture requests to specify the desired output and data processing from Hover's system. ```APIDOC ## Hover Deliverable Types This API reference outlines the available deliverable types and their associated IDs. These IDs are critical for specifying the desired output when creating a job or a capture request via the Hover API. ### Deliverable Types and IDs | Deliverable Name | Deliverable ID | Description | | :--------------------- | :------------- | :----------------------------------------------------------------------------------------------------- | | Roof Only | 2 | An exterior capture that produces a 3D model and measurements of the roof of a structure. | | Complete | 3 | An exterior capture that produces a 3D model and measurements of the roof and walls of a structure. | | Total Living Area Plus | 5 | An exterior capture that produces a 3D model and measurements of the total living area of a structure. | | Total Living Area | 6 | An exterior capture that produces measurements of the total living area of a structure. | | Capture Only | 7 | An exterior capture that produces a 3D model of the structure without measurements. | | Interior | 8 | An interior capture that produces measurements and a sketch of the interior floor plan. | ### Usage When making a request to the `POST /websites/developers_hover_to/jobs` or `POST /websites/developers_hover_to/capture_requests` endpoints, the `deliverable_id` parameter must be set to one of the IDs listed above to define the type of capture and the resulting data. #### Example Request Body Snippet (for creating a job) ```json { "deliverable_id": 3, "property_address": "123 Main St, Anytown, USA" } ``` * **deliverable_id** (integer) - Required - The ID corresponding to the desired deliverable type (e.g., 2 for Roof Only, 3 for Complete). ``` -------------------------------- ### Card and Button Styling (CSS) Source: https://developers.hover.to/docs/welcome Defines the styles for interactive cards, including their base appearance, hover effects, and color variations. It also styles buttons within these cards, ensuring consistent visual cues and interactive feedback. Dependencies include CSS variables for theming. ```css .card { border: 2px solid var(--card-border); /* Card border */ color: var(--card-text); /* Explicitly set card text color */ } .card:hover { transform: translateY(-5px); box-shadow: 0 8px 16px var(--shadow-color); } /* Card color assignments */ .card.card-color1 { --card-bg: var(--card-color1-bg); --card-border: var(--card-color1-border); --card-text: var(--card-color1-text); } .card.card-color2 { --card-bg: var(--card-color2-bg); --card-border: var(--card-color2-border); --card-text: var(--card-color2-text); } .card.card-color3 { --card-bg: var(--card-color3-bg); --card-border: var(--card-color3-border); --card-text: var(--card-color3-text); } .card.card-color4 { --card-bg: var(--card-color4-bg); --card-border: var(--card-color4-border); --card-text: var(--card-color4-text); } .card.card-color5 { --card-bg: var(--card-color5-bg); --card-border: var(--card-color5-border); --card-text: var(--card-color5-text); } .card.card-color6 { --card-bg: var(--card-color6-bg); --card-border: var(--card-color6-border); --card-text: var(--card-color6-text); } .card.card-color7 { --card-bg: var(--card-color7-bg); --card-border: var(--card-color7-border); --card-text: var(--card-color7-text); } .card.card-color8 { --card-bg: var(--card-color8-bg); --card-border: var(--card-color8-border); --card-text: var(--card-color8-text); } .icon { font-size: 30px; margin-bottom: 10px; display: block; color: inherit; } .heading { font-size: 19px; font-weight: bold; margin-bottom: 8px; color: inherit; } .subheading { font-size: 15px; color: inherit; margin-bottom: 15px; } .button { display: inline-block; padding: 10px 20px; margin-top: 10px; font-size: 15px; text-align: center; text-decoration: none !important; border-radius: 5px; cursor: pointer; position: relative; overflow: hidden; transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; background-color: var(--button-bg); color: var(--button-text); } .button::after { content: '\2197'; margin-left: 8px; vertical-align: middle; font-size: 1em; } /* Button color assignments using card-specific button variables */ .card.card-color1 .button { --button-bg: var(--card-color1-button-bg); --button-text: var(--card-color1-button-text); } .card.card-color2 .button { --button-bg: var(--card-color2-button-bg); --button-text: var(--card-color2-button-text); } .card.card-color3 .button { --button-bg: var(--card-color3-button-bg); --button-text: var(--card-color3-button-text); } .card.card-color4 .button { --button-bg: var(--card-color4-button-bg); --button-text: var(--card-color4-button-text); } .card.card-color5 .button { --button-bg: var(--card-color5-button-bg); --button-text: var(--card-color5-button-text); } .card.card-color6 .button { --button-bg: var(--card-color6-button-bg); --button-text: var(--card-color6-button-text); } .card.card-color7 .button { --button-bg: var(--card-color7-button-bg); --button-text: var(--card-color7-button-text); } .card.card-color8 .button { --button-bg: var(--card-color8-button-bg); --button-text: var(--card-color8-button-text); } /* Button hover states */ .card .button:hover { background-color: var(--button-hover-bg) !important; } /* --- General Link Styling for consistency outside of buttons/specific sections --- */ a { color: var(--link-color); text-decoration: none; transition: color 0.2s ease-in-out; } a:hover { text-decoration: underline; } ``` -------------------------------- ### Webhook Event Handling Source: https://developers.hover.to/docs/usage-instructions This section outlines the logic for processing incoming webhook events from Hover. It details how different event types and states trigger actions within the integration, such as updating Salesforce with measurement data or connect request information. ```APIDOC ## Webhook Event Handling ### Description Processes incoming webhook events from Hover to update Salesforce data based on event type and state. ### Method POST ### Endpoint `/webhooks/hover` ### Parameters #### Request Body - **event_type** (string) - Required - The type of event received (e.g., `job-state-changed`, `capture-request-state-changed`, `webhook-verification-code`). - **state** (string) - Required - The current state of the job or request associated with the event. - **data** (object) - Required - Payload containing specific details about the event. ### Logic Flow - **If `event_type` is `job-state-changed` and `state` is `complete`:** - The integration retrieves measurement data from Hover. - The retrieved data is written back into Salesforce. - **If `event_type` is `job-state-changed` and `state` is not `complete`:** - No action is taken. - **If `event_type` is `capture-request-state-changed`:** - The connect request data in Salesforce is updated. - **If `event_type` is `webhook-verification-code`:** - The integration evaluates the webhook verification code. - The webhook is verified and associated with the Webhooks Config object. ### Request Example ```json { "event_type": "job-state-changed", "state": "complete", "data": { "job_id": "hover_job_123", "property_id": "prop_abc" } } ``` ### Response #### Success Response (200) - **message** (string) - Confirmation of webhook processing. #### Response Example ```json { "message": "Webhook processed successfully." } ``` ``` -------------------------------- ### Sample Response Body for Capture Request Source: https://developers.hover.to/docs/send-capture-request-action This JSON object represents the successful response after creating a Capture Request. It includes details about the request ID, capturing user information, job attributes, and links for further actions. ```json { "id": "1875872", "capturing_user_name": "InLin Tuan", "capturing_user_phone": "(402) 214-8827", "capturing_user_email": "inlintuam@gmail.com", "capturing_user_id": null, "requesting_user_id": "135507", "identifier": "UEd_NA", "claim_number": null, "state": "new", "signup_type": "homeowner", "job_attributes": { "name": "InLin Tuan ", "location_line_1": "5332 Hollywood rd", "location_line_2": null, "location_city": "Edina", "location_region": "Mn", "location_postal_code": "55436", "external_identifier": null, "deliverable_id": "7", "client_identifier": "ced98d1b-f078-4257-a28c-55a3d105be8a" }, "captured_user_id": null, "pending_job_id": "12184485", "requesting_user": { "name": "Josh Sterling", "email": "josh@sterlingconcepts.net", "org": { "id": "100093", "name": "Sterling Concepts ", "preferences": { "external_identifier_label": "Lead Number", "external_identifier_required": "false" } } }, "org_id": "100093", "wallet": { "id": "100004", "org": { "customer_display_name": "Sterling Concepts " } }, "connect_url": "https://hover.to/api/v2/capture_requests/UEd_NA" } ``` -------------------------------- ### Single Structure Test Jobs API Source: https://developers.hover.to/docs/testing-your-integration This endpoint allows testing of single-structure scenarios. It requires a pre-existing job in an 'uploading' or 'processing_upload' state. The endpoint updates the job's test state, simulating the reconstruction process for a single structure. ```APIDOC ## PUT /test-jobs/single-structure/{job_id} ### Description Updates the test state of a single-structure job that is in an `uploading` or `processing_upload` state. This simulates the Hover 3D reconstruction pipeline for a single property, allowing for integration testing. ### Method PUT ### Endpoint /test-jobs/single-structure/{job_id} ### Parameters #### Path Parameters - **job_id** (string) - Required - The ID of the job to update. The job must be in an `uploading` or `processing_upload` state. #### Query Parameters - **state** (string) - Optional - Determines the final reconstruction state of the test job. Accepted values: `complete`, `failed`. ### Request Body This endpoint does not require a request body. The `job_id` is a path parameter and the `state` is a query parameter. ### Request Example ```json { "message": "No request body needed" } ``` ### Response #### Success Response (200) Indicates that the job's test state has been updated successfully. It may return details about the updated job. #### Response Example ```json { "job_id": "sample_job_id", "message": "Job test state updated successfully to complete." } ``` ``` -------------------------------- ### Receiving and Handling Webhooks Source: https://developers.hover.to/docs/leveraging-hovers-webhooks Information on how Hover sends `POST` requests for events and how your application should process them. ```APIDOC ## Receiving and Handling Webhooks Once verified, Hover sends `POST` requests to your configured URL for relevant events. Each request contains an `event` attribute to identify the event type. ### Recommended Handling Steps: 1. **Parse Event**: Determine the event type by examining the `event` attribute in the request body. 2. **Extract Data**: Retrieve event-specific data from the request body. 3. **Process Data**: Implement necessary actions, such as making subsequent API requests, triggering workflows, or sending notifications. For a detailed list of available webhook events and their data structures, refer to the [Available Webhooks documentation](https://developers.hover.to/v3/docs/hovers-available-webhooks). ### Error Handling for Webhooks If Hover encounters an issue sending a webhook notification, it will retry up to 25 times with exponential backoff. If a persistent failure occurs, the webhook will be disabled. Error details are logged in the `last_error` attribute. ``` -------------------------------- ### CSS Styling for 'New' Badges and Icons Source: https://developers.hover.to/docs/welcome Styles badges used to highlight new features and general icons within the documentation. Badges have distinct background and text colors, while icons are sized for visibility. ```css .badge-new { background-color: var(--badge-new-bg); color: var(--badge-new-text); padding: 4px 8px; border-radius: 5px; font-size: 0.8em; margin-right: 10px; vertical-align: middle; } .icon { font-size: 1.2em; vertical-align: middle; } ``` -------------------------------- ### Instant Design Image Created Webhook Source: https://developers.hover.to/docs/hovers-available-webhooks This webhook is triggered when a new Instant Design image is generated. The payload includes project and job details, image ID, timestamp, and lead ID. ```APIDOC ## POST /webhooks/instant-design-image-created ### Description This webhook is triggered when a new image is created within the Instant Design feature. It provides details about the project, job, the created image, and the associated lead. ### Method POST ### Endpoint /webhooks/instant-design-image-created ### Request Body - **project_id** (integer) - Required - The ID of the project associated with the Instant Design image. - **project_name** (string) - Required - The name of the project. - **job_id** (integer) - Required - The ID of the job associated with the image. - **event** (string) - Required - The name of the event, "instant-design-image-created". - **timestamp** (string) - Required - The ISO 8601 timestamp indicating when the image was created. - **lead_id** (integer) - Required - The ID of the lead associated with the project. - **image_id** (integer) - Required - The unique identifier for the generated image. - **webhook_id** (integer) - Required - The unique identifier for the webhook delivery. ### Request Example ```json { "project_id": 719829, "project_name": "The Big House", "job_id": 16741840, "event": "instant-design-image-created", "timestamp": "2025-06-26T20:16:20.000Z", "lead_id": 8675309, "image_id": 18921411, "webhook_id": 17885 } ``` ### Response #### Success Response (200) A successful HTTP status code indicates the webhook was received. #### Response Example (No response body) ```