openapi: 3.0.0
info:
  title: Evercam Server
  description: >
    Dashboard related API.


    # Errors


    The API uses standard HTTP status codes to report the success or failure of
    a request. The response body in the case of failures is a JSON

    object with the following structure:

    ```

    {
        "code": "HIGH_LEVEL_CODE",
        "message": "humane readable error message",
        "details": <related errors occurred with the main error>,
        "inner_error": <A sub error>
    }

    ```


    ## Error Code


    The error code is a machine readable token that can be used by clients to
    parse the errors and show more information on the client side. There should

    be a small number of this high level errors codes and care must be taken to
    not update/delete this codes as it'll break any client using them.


    To add more error codes, it's preferrable to create hierarchies and nest the
    more specific errors in the `inner_error` field.


    The following table list the different high level error codes:


    Error Code | Description | HTTP Status Code |

    -----------|-------------|------------------|

    **BAD_ARGUMENT** | Returned when the request fails to pass our validation
    rules, in the details field you'll find the request fields that failed the
    validation rules and the failure's reason for each field. | 400 Bad Request
    |

    **DEVICE_ERROR** | Error when sending a request to a device (Camera, NVR,
    Router, ...etc.) | 400 Bad Request |

    **UNSUPPORTED_OPERATION** | The request was valid but the server cannot
    complete it, either because the feature is not supported or not implemented
    yet | 400 Bad Request |

    **QUOTA_EXCEEDED** | Some endpoints/features are subject to rate limit, once
    this limit is exceeded all the request will return this error. Retrying may
    solve the problem depending on the limit/quota defined | 429 Too Many
    Requests |


    The following errors are subject to change in the near future:


    Error Code | Description | HTTP Status Code |

    -----------|-------------|------------------|

    **INVALID_CREDENTIALS** | The API failed to authenticate the user, details
    field is `null`. | 400 Bad Request |

    **PROVIDER_AUTH_FAILURE** | Failed to authenticate the user with provider
    other than Evercam. | 400 Bad Request |

    **PROVIDER_EMAIL_REQUIRED** | Authentication was successful, but email
    cannot be obtained or was not set on the account | 400 Bad Request |

    **PASSWORD_RESET** | The user needs to reset its password before accessing
    its account. This occurs when a user sign up using a provider other than
    Evercam and then tries to connect using the username / password. | 400 Bad
    Request |

    **REQUIRE_SHARE_REQUEST** | When signing up using a provider, the user
    require a share request from an existing Evercam user | 400 Bad Request |

    **GENERIC** | A global error for internal server errors | 500 Internal
    Server Error |


    ## Details


    The `details` field is used to add more context about the error and listing
    all related errors to the current one. An example is the case of

    `BadArgument` error when updating/creating a resource, the `details` field
    contains the list of field errors (validation errors).


    The field is an `object` with the following structure:

    ```

    {
      "code": "Error Code",
      "message": "Human readable error message",
      "target": "The target field responsible for the error"
    }

    ```


    ## Inner Error


    The `inner_error` field is used to create hierarchies between the errors,
    each `inner_error` reports a more specific error. The client can stop

    parsing the inner errors at any level he wish.


    The `inner_error` field is an object with the following format:


    ```

    {
      "code": "Error Code",
      "message": "A human readable optional message",
      "inner_error": <another nested and more specific error>
    }

    ```


    The following table describes the existing inner codes:

    Error Code | Description | Parent Error Code |

    -----------|-------------|-------------------|

    **DECOMMISSIONED_CAMERA** | Some operations are not allowed with
    decommissioned cameras | **BAD_ARGUMENT** |

    **UNAVAILABLE_LOCATION** | The camera has no longitude/latitude and those
    are needed for some operations | **BAD_ARGUMENT** |

    **NVR_MISSING** | The camera is not connected to an NVR |
    **UNSUPPORTED_OPERATION** |

    **DEVICE_UNSUPPORTED_OPERATION** | The device cannot fulfill the request
    because the rquested feature is not supported or not yet implemented by
    Evercam | **UNSUPPORTED_OPERATION** |

    **NVR_MISSING_RTSP** | The RTSP port is not exposed to complete the query |
    **UNSUPPORTED_OPERATION** |



    # Versioning


    We have some kind of versioning in Evercam API. The current version is v2,
    so all the endpoints starts with the path "/v2/..."


    This is done to not break the clients using the API.


    The available versions are:


    API version | Path

    ------------|-------

    Version 1 | /v1/...

    Version 2 | /v2/...


    # Authentication


    Most of the APIs are protected, so the user must first login before
    attempting to use the APIs, otherwise it'll get a 401 response.


    Currently we have three different authentication mechanisms, each one is
    used for a different purpose.


    ## Bearer Token


    The main authentication mechanism is `Authorization` header using a JWT
    token, after logging the user in (use the
    [`/v2/auth/login`](#operation/login)  endpoint to log in), the back-end
    generates a JWT token.


    This token must be provided with each request in the Authorization header as
    `Authorization: Bearer <jwt_token>` and can be used as follows.

    ```console

    curl 'https://media.evercam.io/v2/cameras' \

    -H 'Authorization: Bearer <jwt_token>'

    ```


    ## API id/key

    The second authenitcation mecanism is using API id/Key, (it's **deprecated**
    to use for regular authentication, prefere `Authorization` token), used
    mostly for impersonation system where the admin runs requests on behalf of
    the users.


    Each user has an associated API id/key generated when the user is
    registered. To use them for authenticating, just provide them in two custom
    headers `x-api-id` and `x-api-key`.


    ## Basic

    The third authenitcation mecanism is used to access some features (live
    dashboard), it's `Basic` authentication. The way to use it, is to provide a
    base64 encoded string of `username:password`.


    `Authorization: Basic <base64_string>`
  version: 3.0-oas3
servers:
  - url: https://media.evercam.io
  - url: http://localhost:4000
security:
  - Bearer-Token: []
paths:
  /v2/status:
    $ref: https://media.evercam.io/openapi/paths/v2_status.yml
  /v2/proxy/posthog:
    $ref: https://media.evercam.io/openapi/paths/v2_posthog_proxy.yml
  /v2/logs:
    $ref: https://media.evercam.io/openapi/paths/v2_logs.yml
  /v2/proxy/storyblok:
    $ref: https://media.evercam.io/openapi/paths/v2_storyblok_proxy.yml
  /v2/auth/login:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_login.yml
  /v2/auth/{provider}:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_{provider}.yml
  /v2/auth/impersonate/{token}:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_impersonate_{token}.yml
  /v2/auth/logout:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_logout.yml
  /v2/auth/credentials:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_credentials.yml
  /v2/auth/users/me:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_users_me.yml
  /v2/auth/options:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_options.yml
  /v2/auth/signup_options:
    $ref: https://media.evercam.io/openapi/paths/v2_signup_options.yml
  /v2/auth/provider/{provider}:
    $ref: https://media.evercam.io/openapi/paths/v2_auth_provider_{provider}.yml
  /v2/oauth/authorize:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth_authorize.yml
  /v2/oauth/client-info:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth_client_info.yml
  /v2/oauth/consent:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth_consent.yml
  /v2/oauth/token:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth_token.yml
  /v2/oauth/revoke:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth_revoke.yml
  /v2/oauth/introspect:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth_introspect.yml
  /v2/users:
    $ref: https://media.evercam.io/openapi/paths/v2_users.yml
  /v2/users/permissions:
    $ref: https://media.evercam.io/openapi/paths/v2_users_permissions.yml
  /v2/users/roles:
    $ref: https://media.evercam.io/openapi/paths/v2_users_roles.yml
  /v2/users/me:
    $ref: https://media.evercam.io/openapi/paths/v2_users_me.yml
  /v2/users/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{id}.yml
  /v2/users/{email}/delete:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{email}_delete.yml
  /v2/users/{email}/features:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{email}_features.yml
  /v2/users/session/activities:
    $ref: https://media.evercam.io/openapi/paths/v2_users_session_activities.yml
  /v2/users/{id}/password/reset:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{id}_password_reset.yml
  /v2/users/{id}/password:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{id}_password.yml
  /v2/users/{email}/password/update:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{email}_password_update.yml
  /v2/users/{id}/confirm:
    $ref: https://media.evercam.io/openapi/paths/v2_users_{id}_confirm.yml
  /v2/users/active-sessions:
    $ref: https://media.evercam.io/openapi/paths/v2_users_active-sessions.yml
  /v2/users/active-sessions/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_users_active-sessions_{id}.yml
  /v2/company:
    $ref: https://media.evercam.io/openapi/paths/v2_company.yml
  /v2/company/hdds:
    $ref: https://media.evercam.io/openapi/paths/v2_company_hdds.yml
  /v2/company/users:
    $ref: https://media.evercam.io/openapi/paths/v2_company_users.yml
  /v2/company/projects:
    $ref: https://media.evercam.io/openapi/paths/v2_company_projects.yml
  /v2/company/cameras:
    $ref: https://media.evercam.io/openapi/paths/v2_company_cameras.yml
  /v2/company/kits:
    $ref: https://media.evercam.io/openapi/paths/v2_company_kits.yml
  /v2/cameras/{camera_exid}/recordings/snapshots/{year}/{month}/days:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots_{year}_{month}_days.yml
  /v2/cameras/{camera_exid}/recordings/snapshots/{year}/{month}/{day}/hours:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots_{year}_{month}_{day}_hours.yml
  /v2/cameras/{camera_exid}/recordings/snapshots/latest:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots_latest.yml
  /v2/cameras/{camera_exid}/recordings/snapshots/oldest:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots_oldest.yml
  /v2/cameras/{camera_exid}/recordings/snapshots/{timestamp}/nearest:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots_{timestamp}_nearest.yml
  /v2/cameras/{camera_exid}/snapshots:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_snapshots.yml
  /v2/cameras/{camera_exid}/recordings/snapshots:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots.yml
  /v2/cameras/{camera_exid}/recordings/snapshots/{timestamp}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_recordings_snapshots_{timestamp}.yml
  /v2/cameras:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras.yml
  /v2/public/cameras:
    $ref: https://media.evercam.io/openapi/paths/v2_public_cameras.yml
  /v2/cameras/{camera_exid}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}.yml
  /v2/cameras/{camera_exid}/live/snapshot:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_live_snapshot.yml
  /v2/cameras/{camera_exid}/thumbnail:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_thumbnail.yml
  /v2/cameras/{camera_exid}/last-public-note:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_last-public-note.yml
  /v2/projects/{project_exid}/cameras:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_cameras.yml
  /v2/widgets/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets_{id}.yml
  /v2/widgets/{id}/status:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets_{id}_status.yml
  /v2/projects/{project_exid}/cameras/reorder:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_cameras_reorder.yml
  /v2/widgets/{widget_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets_{widget_id}.yml
  /v2/widgets/{widget_id}/status:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets_{widget_id}_status.yml
  /v2/widgets:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets.yml
  /v2/widgets/credentials:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets_credentials.yml
  /v2/widgets/session:
    $ref: https://media.evercam.io/openapi/paths/v2_widgets_session.yml
  /v2/video-walls:
    $ref: https://media.evercam.io/openapi/paths/v2_video_wall.yml
  /v2/video-walls/{exid}:
    $ref: https://media.evercam.io/openapi/paths/v2_video_wall_{exid}.yml
  /v2/cameras/{camera_exid}/health:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_health.yml
  /v2/projects/{project_exid}/transfer/{new_owner_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_transfer_{new_owner_id}.yml
  /v2/projects/{project_exid}/media-hub/timelapses:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_timelapses.yml
  /v2/projects/{project_exid}/media-hub/timelapses/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_timelapses_{id}.yml
  /v2/cameras/{camera_exid}/timelapses/snapshots:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_timelapses_snapshots.yml
  /v2/cameras/{camera_exid}/hls:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_hls.yml
  /v2/cameras/{camera_exid}/streaming:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_streaming.yml
  /v2/projects/{project_exid}/progress-photos:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_progress-photos.yml
  /v2/progress-photos:
    $ref: https://media.evercam.io/openapi/paths/v2_progress-photos.yml
  /v2/progress-photos/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_progress-photos_{id}.yml
  /v2/progress-photos/{id}/unsubscribe:
    $ref: https://media.evercam.io/openapi/paths/v2_progress-photos_{id}_unsubscribe.yml
  /v2/projects/{project_exid}/media-hub:
    get:
      $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_all_archives.yml
    post:
      $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_archives.yml
  /v2/projects/{project_exid}/media-hub/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_archives_{id}.yml
  /v2/projects/{project_exid}/media-hub/{id}/retry:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_archives_{id}_retry.yml
  /v2/cameras/{camera_exid}/battery-readings:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_battery-readings.yml
  /v2/cameras/{camera_exid}/battery-readings/voltage-summary:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_battery-readings_voltage-summary.yml
  /v2/projects/{project_exid}/media-hub/users:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_archives_users.yml
  /v2/projects/{project_exid}/media-hub/{id}/thumbnail:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_archives_{id}_thumbnail.yml
  /v2/cameras/{camera_exid}/users/resend-invite:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_users_resend_invite.yml
  /v2/projects/{project_exid}/media-hub/compares:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_compares.yml
  /v2/projects/{project_exid}/media-hub/compares/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_compares_{id}.yml
  /v2/projects/{project_exid}/media-hub/compares/bim-compares:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_bim-compares.yml
  /v2/cameras/{camera_exid}/bim:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_bim.yml
  /v2/cameras/{camera_exid}/bim/pending:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_bim_pending.yml
  /v2/cameras/{camera_exid}/bim/{timestamp}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_bim_{timestamp}.yml
  /v2/cameras/{camera_exid}/bim/camera-parameters:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_bim_camera-parameters.yml
  /v2/cameras/{camera_exid}/ptz/status:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_status.yml
  /v2/cameras/{camera_exid}/ptz/nodes:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_nodes.yml
  /v2/cameras/{camera_exid}/ptz/configurations:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_configurations.yml
  /v2/cameras/{camera_exid}/ptz/presets:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_presets.yml
  /v2/cameras/{camera_exid}/ptz/continuous/stop:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_continuous_stop.yml
  /v2/cameras/{camera_exid}/ptz/home:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_home.yml
  /v2/cameras/{camera_exid}/ptz/home/set:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_home_set.yml
  /v2/cameras/{camera_exid}/ptz/presets/create:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_presets_create.yml
  /v2/cameras/{camera_exid}/ptz/presets/{preset_token}/set:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_presets_{preset_token}_set.yml
  /v2/cameras/{camera_exid}/ptz/presets/go/{preset_token}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_presets_go_{preset_token}.yml
  /v2/cameras/{camera_exid}/ptz/continuous/start/{direction}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_continuous_start_{direction}.yml
  /v2/cameras/{camera_exid}/ptz/continuous/zoom/{mode}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_continuous_zoom_{mode}.yml
  /v2/cameras/{camera_exid}/ptz/relative:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_relative.yml
  /v2/cameras/{camera_exid}/ptz/presets/{preset_token}/remove:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_ptz_presets_{preset_token}_remove.yml
  /v2/onvif/v20/{service}/{operation}:
    $ref: https://media.evercam.io/openapi/paths/v2_onvif_v20_{service}_{operation}.yml
  /v2/projects:
    $ref: https://media.evercam.io/openapi/paths/v2_projects.yml
  /v2/projects/{project_exid}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}.yml
  /v2/projects/{project_exid}/battery-readings:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_battery-readings.yml
  /v2/projects/{project_exid}/camera_refs:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_camera_refs.yml
  /v2/projects/{project_exid}/thumbnail:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_thumbnail.yml
  /v2/projects/{project_exid}/thumbnail/reset:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_reset_thumbnail.yml
  /v2/projects/{project_exid}/logos:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_logos.yml
  /v2/projects/{project_exid}/logos/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_logos_{id}.yml
  /v2/projects/{project_exid}/weather/current:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_weather_current.yml
  /v2/projects/{project_exid}/weather:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_weather.yml
  /v2/projects/{project_exid}/weather/filters:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_weather_filters.yml
  /v2/projects/{project_exid}/shares/cameras:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_shares_cameras.yml
  /v2/projects/{project_exid}/waiting-camera-placeholder:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_waiting_camera_placeholder.yml
  /v2/projects/{project_exid}/comments:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_comments.yml
  /v2/projects/{project_exid}/comments/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_comments_{id}.yml
  /v2/projects/{project_exid}/roles:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_roles.yml
  /v2/projects/{project_exid}/roles/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_roles_{id}.yml
  /v2/projects/{project_exid}/roles/{id}/permissions:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_roles_{id}_permissions.yml
  /v2/projects/{project_exid}/users:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_users.yml
  /v2/projects/{project_exid}/users/resend-invite:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_users_resend_invite.yml
  /v2/projects/{project_exid}/users/cancel-invite/{invite_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_users_cancel_invite.yml
  /v2/cameras/{camera_exid}/nvr/snapshots/extract/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_nvr_snapshots_extract_{id}.yml
  /v2/users/auth/autodesk/callback:
    $ref: https://media.evercam.io/openapi/paths/v2_users_auth_autodesk_callback.yml
  /v2/users/auth/autodesk/revoke:
    $ref: https://media.evercam.io/openapi/paths/v2_users_auth_autodesk_revoke.yml
  /v2/autodesk/hubs:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_hubs.yml
  /v2/autodesk/hubs/{hub_id}/projects:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_hubs_{hub_id}_projects.yml
  /v2/autodesk/hubs/{hub_id}/projects/{project_id}/folders:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_hubs_{hub_id}_projects_{project_id}_folders.yml
  /v2/autodesk/projects/{project_id}/folders/{parent_folder_id}/subfolders:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_projects_{project_id}_folders_{parent_folder_id}_subfolders.yml
  /v2/autodesk/projects/{project_id}/folders/{folder_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_projects_{project_id}_folders_{folder_id}.yml
  /v2/autodesk/upload-snapshot:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_upload-snapshot.yml
  /v2/autodesk/{exid}/token/viewer:
    $ref: https://media.evercam.io/openapi/paths/v2_autodesk_{exid}_token_viewer.yml
  /v2/users/auth/procore/callback:
    $ref: https://media.evercam.io/openapi/paths/v2_users_auth_procore_callback.yml
  /v2/users/auth/procore/revoke:
    $ref: https://media.evercam.io/openapi/paths/v2_users_auth_procore_revoke.yml
  /v2/procore/companies:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_companies.yml
  /v2/procore/companies/observation-types:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_companies_observation-types.yml
  /v2/procore/companies/contributing-behaviors:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_companies_contributing-behaviors.yml
  /v2/procore/companies/contributing-conditions:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_companies_contributing-conditions.yml
  /v2/procore/companies/hazards:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_companies_hazards.yml
  /v2/procore/companies/trades:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_companies_trades.yml
  /v2/procore/observations:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_observations.yml
  /v2/procore/observations/next-available-number:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_observations_next-available-number.yml
  /v2/procore/observations/assignees:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_observations_assignees.yml
  /v2/procore/observations/form:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_observations_form.yml
  /v2/procore/observations/distribution-members:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_observations_distribution-members.yml
  /v2/procore/image-categories:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_image-categories.yml
  /v2/procore/projects:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_projects.yml
  /v2/procore/projects/locations:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_projects_locations.yml
  /v2/procore/upload-live-view:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_upload-live-view.yml
  /v2/procore/upload-recording:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_upload-recording.yml
  /v2/procore/specification-sections:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_specification-sections.yml
  /v2/procore/custom-field-options:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_custom-field-options.yml
  /v2/procore/upload-snapshot:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_upload-snapshot.yml
  /v2/procore/projects/permissions:
    $ref: https://media.evercam.io/openapi/paths/v2_procore_projects_permissions.yml
  /v2/aconex/auth/callback:
    $ref: https://media.evercam.io/openapi/paths/v2_aconex_auth_callback.yml
  /v2/aconex/projects:
    $ref: https://media.evercam.io/openapi/paths/v2_aconex_projects.yml
  /v2/aconex/projects/{project_id}/register/schema:
    $ref: https://media.evercam.io/openapi/paths/v2_aconex_projects_{project_id}_register_schema.yml
  /v2/aconex/projects/{project_id}/register/schema/{document_type_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_aconex_projects_{project_id}_register_schema_{document_type_id}.yml
  /v2/aconex/projects/{project_id}/upload-snapshot:
    $ref: https://media.evercam.io/openapi/paths/v2_aconex_projects_{project_id}_upload-snapshot.yml
  /v2/aconex/auth/revoke:
    $ref: https://media.evercam.io/openapi/paths/v2_aconex_auth_revoke.yml
  /v2/users/auth/hammertech/connect:
    $ref: https://media.evercam.io/openapi/paths/v2_users_auth_hammertech_connect.yml
  /v2/users/auth/hammertech/revoke:
    $ref: https://media.evercam.io/openapi/paths/v2_users_auth_hammertech_revoke.yml
  /v2/hammertech/projects:
    $ref: https://media.evercam.io/openapi/paths/v2_hammertech_projects.yml
  /v2/hammertech/issue-types:
    $ref: https://media.evercam.io/openapi/paths/v2_hammertech_issue-types.yml
  /v2/hammertech/locations:
    $ref: https://media.evercam.io/openapi/paths/v2_hammertech_locations.yml
  /v2/hammertech/issues:
    $ref: https://media.evercam.io/openapi/paths/v2_hammertech_issues.yml
  /v2/hammertech/stored-files:
    $ref: https://media.evercam.io/openapi/paths/v2_hammertech_stored-files.yml
  /v2/oauth2-tokens/providers:
    $ref: https://media.evercam.io/openapi/paths/v2_oauth2-tokens_providers.yml
  /v2/admin/hdds:
    $ref: https://media.evercam.io/openapi/paths/v2_admin_hdds.yml
  /v2/admin/hdds/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_admin_hdds_{id}.yml
  /v2/admin/hdds/{hdd_id}/footages:
    $ref: https://media.evercam.io/openapi/paths/v2_admin_hdds_{hdd_id}_footages.yml
  /v2/admin/hdds/{hdd_id}/footages/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_admin_hdds_{hdd_id}_footages_{id}.yml
  /v2/cameras/{camera_exid}/layers:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_layers.yml
  /v2/cameras/{camera_exid}/layers/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_layers_{id}.yml
  /v2/cameras/{camera_exid}/calibrations/current/{timestamp}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_calibrations_current_{timestamp}.yml
  /v2/cameras/{camera_exid}/calibrations:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_calibrations_.yml
  /v2/cameras/{camera_exid}/calibrations/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_calibrations_{id}.yml
  /v2/cameras/{camera_exid}/anpr:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_anpr.yml
  /v2/cameras/{camera_exid}/anpr/plates:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_anpr_plates.yml
  /v2/cameras/{camera_exid}/anpr/matched:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_anpr_matched.yml
  /v2/cameras/{camera_exid}/anpr/{eventid}:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_anpr_{eventid}.yml
  /v2/cameras/{camera_exid}/anpr/{eventid}/thumbnail:
    $ref: https://media.evercam.io/openapi/paths/v2_cameras_{camera_exid}_anpr_{eventid}_thumbnail.yml
  /v2/payments:
    $ref: https://media.evercam.io/openapi/paths/v2_payments.yml
  /v2/notifications:
    $ref: https://media.evercam.io/openapi/paths/v2_notifications.yml
  /v2/notifications/mark-as-read:
    $ref: https://media.evercam.io/openapi/paths/v2_notifications_mark_as_read.yml
  /v2/notifications/{id}:
    $ref: https://media.evercam.io/openapi/paths/v2_notifications_{id}.yml
  /v2/mailing/unsubscribe:
    $ref: https://media.evercam.io/openapi/paths/v2_suppressions.yml
  /v2/nexmo/delivery/receipts:
    $ref: https://media.evercam.io/openapi/paths/v2_nexmo_delivery_receipts.yml
  /v2/nexmo/inbound/messages:
    $ref: https://media.evercam.io/openapi/paths/v2_nexmo_inbound_messages.yml
  /v2/projects/{project_exid}/connectors:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_connector.yml
  /v2/projects/{project_exid}/snapshots/deliver/email:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_snapshots_deliver_email.yml
  /v2/projects/{project_exid}/xweather/connect:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_xweather_connect.yml
  /v2/projects/{project_exid}/xweather/revoke:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_xweather_revoke.yml
  /v2/projects/team-members:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_team-members.yml
  /v2/projects/{project_exid}/contacts:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_contacts.yml
  /v2/projects/{project_exid}/camera-inquiry-request:
    $ref: https://media.evercam.io/openapi/paths/v2_projects_{project_exid}_camera-inquiry-request.yml
  /v2/developer/apps:
    $ref: https://media.evercam.io/openapi/paths/v2_developer_apps.yml
  /v2/developer/apps/{client_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_developer_apps_{client_id}.yml
  /v2/developer/apps/{client_id}/regenerate-secret:
    $ref: https://media.evercam.io/openapi/paths/v2_developer_apps_{client_id}_regenerate-secret.yml
  /v2/support/zoho-auth-url:
    $ref: https://media.evercam.io/openapi/paths/v2_support_zoho-auth-url.yml
  /v2/firebase/360-thumbnail:
    $ref: https://media.evercam.io/openapi/paths/v2_firebase_360-thumbnail.yml
  /v2/ring/callback:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_callback.yml
  /v2/ring/userinfo:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_userinfo.yml
  /v2/ring/devices:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_devices.yml
  /v2/ring/devices/import:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_devices_import.yml
  /v2/ring/devices/{camera_exid}:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_devices_{camera_exid}.yml
  /v2/ring/devices/{camera_exid}/move:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_devices_{camera_exid}_move.yml
  /v2/ring/devices/{camera_exid}/live:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_devices_{camera_exid}_live.yml
  /v2/ring/devices/{camera_exid}/live/{session_id}:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_devices_{camera_exid}_live_{session_id}.yml
  /v2/ring/disconnect:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_disconnect.yml
  /v2/ring/webhook:
    $ref: https://media.evercam.io/openapi/paths/v2_ring_webhook.yml
components:
  securitySchemes:
    Bearer-Token:
      type: http
      scheme: bearer
      bearerFormat: JWT
    api_id:
      type: apiKey
      name: X-API-ID
      in: header
    api_key:
      type: apiKey
      name: X-API-KEY
      in: header
tags:
  - name: Auth
    description: Operations related to user's authententication
  - name: Proxy
    description: Operations related to user's authententication
  - name: Oauth
    description: OAuth client and authorized-app management
  - name: Status
    description: System and health-check endpoints
  - name: Users
    description: The users API endpoints allow a user to manage his account details.
  - name: Cameras
    description: All operations related to the management of cameras
  - name: Battery
    description: Camera battery readings
  - name: Calibrations
    description: Camera calibration operations
  - name: ANPR
    description: Automatic Number Plate Recognition operations
  - name: Projects
    description: All operations related to projects, including roles, members and invites
  - name: Project Shares
    description: Operations related to sharing projects and project cameras
  - name: Project Connectors
    description: Operations related to project third-party connectors (e.g. weather providers)
  - name: Weather
    description: Project weather data operations
  - name: Notifications
    description: User notification operations
  - name: Video Walls
    description: All operations related to video walls
  - name: Widgets
    description: All operations related to embeddable camera widgets
  - name: Company
    description: All operations related to companies
  - name: Comments
    description: All operations related to the management of comments
  - name: Recordings
    description: Describe all operations related to camera's snapshots and cloud recordings
  - name: Timelapse
    description: The timelapse endpoints allow a user to manage timelapses
  - name: Progress Photo
    description: All operations related to Progress Photo
  - name: Mailing
    description: Mailing related operations
  - name: Media
    description: All operations related to media
  - name: Shares
    description: All operations related to sharing cameras with users
  - name: Compares
    description: All operations related to compares
  - name: Bim
    description: All operations related to bim
  - name: Onvif
    description: All operations related to Onvif
  - name: Nvr
    description: All operations related to NVR
  - name: Procore
    description: All operations related to procore
  - name: Aconex
    description: All operations related to aconex
  - name: HammerTech
    description: All operations related to HammerTech
  - name: Autodesk
    description: All operations related to Autodesk
  - name: HDDs
    description: All operations related to HDDs
  - name: Layers
    description: All operations related to layers
  - name: Payment
    description: All operations related to Payment
  - name: Developer Portal
    description: Self-service OAuth application management for developers
  - name: Snapshot Delivery
    description: Endpoints for delivering annotated snapshots to external destinations
  - name: Logs
    description: Forward frontend logs into the backend's system logs
  - name: Support
    description: Server-side helpers for support-portal integrations (Zoho RemoteAuth signing)
  - name: Firebase
    description: Server-side proxy for Firebase Storage objects (keeps the storage token off the SPA bundle)
  - name: OAuth
    description: OAuth 2.0 authorization server endpoints
  - name: Ring
    description: Ring video doorbell integration
