{"openapi":"3.1.0","info":{"title":"Bouncie API","description":"# Data Integration Specification\n\nBouncie offers data integrations in two varieties:\n\n- [Webhooks](#webhooks) (push)\n- [Rest API Endpoints](#rest-api-endpoints) (pull)\n\nThe registration and setup for your application with Bouncie is done through the [Bouncie Developer Portal](https://www.bouncie.dev/).\n\n---\n\n# Navigation\n1. [Authorization](#authorization)\n2. [Webhooks](#webhooks)\n3. [Geo-Zones](#geo-zones-1)\n4. [Zapier Integration](#zapier-integration)\n5. [FAQ](#faq)\n\n## Authorization\n\nBouncie API uses [User Authentication with OAuth 2.0](https://oauth.net/articles/authentication/) to authorize users for your application.\n\nTo obtain Authorization, you must first register your application on the [Bouncie Developer Portal](https://www.bouncie.dev/) and follow the authorization code flow below.\n\n1. You prompt your user to a webpage where they can give you permission to access their data.\n1. Once your user has approved, they will be redirected back to a redirect uri that you will have initially set up for your application on the [Bouncie Developer Portal](https://www.bouncie.dev) with an authorization code as a query parameter (This step is enough to start receiving events for any webhooks you have registered).\n1. You then use that authorization code to get an access token which can be used to make requests to Bouncie API REST endpoints.\n\n### 1. Have your application request authorization; the user will log in using their Bouncie account and grant access.\n\nTo request authorization, redirect your user to <https://auth.bouncie.com/dialog/authorize> with the following parameters:\n\n| Request Query Parameter | Value                                                                                                                                                                                                                                                                                                                                                                                            |\n| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| client_id               | This value is required. When you set up your application on the [Bouncie Developer Portal](https://www.bouncie.dev/), you can set your Client ID                                                                                                                                                                                                                                                 |\n| response_type           | This value is required. It should be set to \"code\"</span>                                                                                                                                                                                                                                                                                                                                        |\n| redirect_uri            | This value is required. This is the URI the user will be redirected back to once they have granted permission. The URI needs to have been added to your application's Redirect URI list on the [Bouncie Developer Portal](https://www.bouncie.dev/). The value of this parameter must exactly match one of the Redirect URIs you have set up, including upper or lowercase, terminal slashes etc |\n| state                   | This value is optional. When the user is redirected back to your app, whatever value you include as the state will also be included in the redirect. You can check to see if the value you sent for state is the same as the value you got back for added security                                                                                                                               |\n| code_challenge          | This value is optional. Base64Url encoded `code_verifier` for using [PKCE](https://datatracker.ietf.org/doc/html/rfc7636).                                                                                                                                                                                                                                                                       |\n| code_challenge_method   | This value is optional. `S256` (recommended) or `plain`. Defaults to `S256` if `code_challenge` is provided.                                                                                                                                                                                                                                                                                     |\n| resource                | This value is optional. URI of the protected resource (e.g. `https://api.bouncie.dev/v1/`). Echoed as `aud` claim in the access token per RFC 8707.                                                                                                                                                                                                                                              |\n\n> For more information on using PKCE see the [RFC](https://datatracker.ietf.org/doc/html/rfc7636)\n\n#### Example\n\nAn example of an authorization URL:\n\n`https://auth.bouncie.com/dialog/authorize?client_id=my-app&redirect_uri=http://www.example.com/&response_type=code&state=abcdefg`\n\nAn example of the response URL if the user grants permission:\n\n`http://www.example.com/?code=I1uHE12LIK123PQRmnoGD1RnR12Ybrr99Tio1SQRpow12dabc&state=abcdefg`\n\n| Response Query Parameter | Value                                                                                                                                                                                                                                                                                                |\n| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| code                     | An authorization code that can be exchanged for an access token. There is no expiration for the authorization code, however if the user goes through the authorization flow for your application again and a new authorization code is generated, the old authorization code will no longer be valid |\n| state                    | The value of the state parameter supplied in the request.                                                                                                                                                                                                                                            |\n\n#### At this point, if you have any [Webhooks](#webhooks) set up, you will start receiving events for the user that has just granted your application permission\n\n### 2. Have your application request access tokens.\n\nOnce you have received an authorization code, you will need to exchange it with an access token by making a POST request to <https://auth.bouncie.com/oauth/token>. The body of this POST (JSON) will be as follows:\n\n| Request Header Field | Value            |\n| -------------------- | ---------------- |\n| Content-Type         | application/json |\n\n| Request Body Field | Value                                                                                                                                                                                                                                                      |\n| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| client_id          | This value is required. When you set up your application on the [Bouncie Developer Portal](https://www.bouncie.dev/), you can set your Client ID                                                                                                           |\n| client_secret      | This value is required. It is provided to you when you set up your application on the [Bouncie Developer Portal](https://www.bouncie.dev/)                                                                                                                 |\n| grant_type         | This value is required. It must be set to \"authorization_code\"                                                                                                                                                                                             |\n| code               | This value is required. It is the authorization code returned by the initial <https://auth.bouncie.com/dialog/authorize> endpoint                                                                                                                          |\n| redirect_uri       | This value is required. It must match one of the Redirect URI's you have set up for your application on the [Bouncie Developer Portal](https://www.bouncie.dev/). This value is ONLY used for validation, there is no actual redirection that happens here |\n| code_verifier      | This value is required if you are using [PKCE](https://datatracker.ietf.org/doc/html/rfc7636).                                                                                                                                                             |\n\nAn alternative way to send the Client ID and the Client Secret is as an authorization header with the value set to a base64 encoded string as follows:\n\n| Request Header Field | Value                                                                                                                                                                                                                                                                                                                         |\n| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Content-Type         | application/json                                                                                                                                                                                                                                                                                                              |\n| Authorization        | If you do not send the Client ID and the Client Secret as part of the request body, you can send it using the Authorization header. The value **must** be a base64 encoded string and **must** have the following format <span id=\"highlighted-code\">Authorization: Basic _< base64 encoded client_id:client_secret >_</span> |\n\nA successful request for the access token will yield a JSON response with the following fields:\n\n| Response field | Value Type | Value Description                                                                      |\n| -------------- | ---------- | -------------------------------------------------------------------------------------- |\n| access_token   | string     | An access token that can be provided in subsequent calls to Bouncie API REST endpoints |\n| refresh_token  | string     | A refresh token that can be exchanged for a new access token                           |\n| expires_in     | int        | The time period (in seconds) for which the access token is valid.                      |\n| token_type     | string     | Describes how the access token may be used. It is always set to \"Bearer\".              |\n\nYou can now make calls to Bouncie API REST endpoints by sending the access token as the request authorization header.\n\n### 3. Refresh an expired access token.\n\nOnce your access token has expired, you will need to exchange your refresh token for a new access token by making another POST request to <https://auth.bouncie.com/oauth/token>. The body of this POST (JSON) will be as follows:\n\n| Request Header Field | Value            |\n| -------------------- | ---------------- |\n| Content-Type         | application/json |\n\n| Request Body Field | Value                                                                                                                                                                                                                                                      |\n| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| client_id          | This value is required. When you set up your application on the [Bouncie Developer Portal](https://www.bouncie.dev/), you can set your Client ID                                                                                                           |\n| client_secret      | This value is required. It is provided to you when you set up your application on the [Bouncie Developer Portal](https://www.bouncie.dev/)                                                                                                                 |\n| grant_type         | This value is required. It must be set to \"refresh_token\"                                                                                                                                                                                                  |\n| refresh_token      | This value is required. It is the refresh token returned by the previous request to the <https://auth.bouncie.com/oauth/token> endpoint                                                                                                                    |\n\nA successful request will yield a JSON response with the same fields as the previous request with a new access token and new refresh token.\nThe previous refresh token will no longer be valid.\nEach refresh token will expire after some time if it is not used.\nIf the refresh token expires, you can generate a new one by making a POST request to the <https://auth.bouncie.com/oauth/token> endpoint again with the same POST body as described in [step 2](#2-have-your-application-request-access-tokens).\n\n---\n\n## Webhooks\n\nWebhooks can be used to be notified about events occurring on your vehicle. This can greatly your simplify the overhead for loading data, since polling the restful APIs may no longer be necessary.\n\n**Configuration is simple:** Provide Bouncie secure server side URL endpoint and specify the types of events you wish to receive.\n(ex: [https://myapp.mycompany.com/bouncie-webhook](https://myapp.mycompany.com/bouncie-webhook)). Webhooks can be set up for your application on the [Bouncie Developer Portal](https://www.bouncie.dev/).\n\n**_That’s it!_** Now when an event occurs for your any of your connected vehicles. Bouncie will POST JSON event payloads to your endpoint in real time.\n\n### Webhook Security\n\nWebhooks use a unique key that you provide to secure calls. An `Authorization` header will be sent with every outgoing webhook that you can use to validate that the incoming request is actually from Bouncie.\n\nAdditionally, Bouncie provides an `X-Bouncie-Authorization` header that is also included with every outgoing webhook. This header will have the same value as the `Authorization` header and can be used for validation in the same manner. Bouncie provides this header in the event that the platform your app is running on has removed the `Authorization` header.\n\n```json\n// HTTP Headers\n{\n  \"Authorization\": \"yourKey\",\n  \"X-Bouncie-Authorization\": \"yourKey\",\n}\n```\n\nAs part of the process of setting up your application you will provide the initial value for this key.\n\n### Webhook Key rotation\n\nWebhook consumers can change their unique key by returning a new key in an `Authorization` response header in the response to the webhook.\n\n### Retries\n\nURL endpoint(s) for webkook calls should respond with `2xx` level status code to indicate successful receipt.\n\nBouncie will attempt to retry a webhook Request if it times out, responds with invalid JSON, or responds with a `4xx` or `5xx` level status code. A backoff policy will be used to prevent overloading the webhook endpoint. Bouncie will continue retrying until the maximum amount of retries are reached.\n\n### Event Types\n\n#### Device\n- [Device Connected](webhooks/deviceConnect/post)\n- [Device Disconnected](webhooks/deviceDisconnect/post)\n- [VIN Change](webhooks/vinChange/post)\n\n#### Vehicle Health\n- [MIL](webhooks/mil/post)\n- [Low Battery](webhooks/battery/post)\n\n#### Trips\n- [Trip Start](webhooks/tripStart/post)\n- [Trip Data](webhooks/tripData/post)\n- [Trip Metrics](webhooks/tripMetrics/post)\n- [Trip End](webhooks/tripEnd/post)\n\n#### Geo-Zones\n- [Application Geo-Zone](webhooks/applicationGeozone/post)\n- [User Geo-Zone](webhooks/userGeozone/post)\n\n---\n\n## Rest API Endpoints\n\n### Base URL\n\n- The base URL is [https://api.bouncie.dev/v1/](https://api.bouncie.dev/v1/).\n- All API requests must use HTTPS. Calls made over HTTP will fail.\n- Successful requests return JSON data (application/json).\n\n### Authentication\n\nThe Bouncie API uses the access token that is granted to you per user who grants access to their information. This access token is generated when you [obtain authorization](#authorization).\n\n```json\n// HTTP Headers\n{\n  \"Authorization\": \"AccessTokenYouHaveGenerated\",\n  \"Content-Type\": \"application/json\"\n}\n```\n\n### Responses and Errors\n\nBouncie API uses standard HTTP response codes to indicate success or failure of an API request.\n\n| Responses               | Description                                                                                                                               |\n| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| 200 - OK                | A GET request succeeded. JSON response.                                                                                                   |\n| 201 - Created           | A POST response succeeded. JSON response.                                                                                                 |\n| 400 - Bad Request       | The request was unacceptable, often due to missing a required parameter. JSON response`{ \"errors\": \"This was a bad request because...\" }` |\n| 401 - Unauthorized      | No valid API key provided.                                                                                                                |\n| 404 - Not Found         | The requested resource doesn't exist.                                                                                                     |\n| 50x - Application Error | An error occurred on Bouncie API                                                                                                          |\n\n---\n\n## Geo-Zones\n\nBouncie supports two types of Geo-Zones: User Geo-Zones, which are managed by users, and Application Geo-Zones, which are created and managed through the API.\n\n### User Geo-Zones\n\nThese are created and managed directly by users through the Bouncie app or web dashboard. Users can set up zones around locations of interest—like home, school, or work—and receive notifications when their vehicle enters or exits these areas. User Geo-Zones are personal and cannot be modified by external integrations.\n\n### Application Geo-Zones\n\nApplication Geo-Zones are designed for integrations that require programmatically defined zones. These zones are created and managed through the Bouncie API, allowing for dynamic setup and control independent of User Geo-Zones. Application Geo-Zones **do not appear** in the Bouncie client experience and do not trigger notifications to users.\n\nTo create an Application Geo-Zone:\n1. **Create a Location**: Define the geographic area by specifying coordinates and a radius or a polygon. Refer to the [Create Location](paths/v1-locations/post) endpoint for details.\n2. **(Optional) Create a Schedule**: Define active time periods for the geozone. This step is optional. Refer to the [Create Schedule](paths/v1-schedules/post) endpoint for details.\n3. **Create the Application Geo-Zone**: Use the IDs from the Location and Schedule (if applicable) to create the geozone. Refer to the [Create Application Geo-Zone](paths/v1-application-geozones/post) endpoint for details.\n\n---\n\n## Zapier Integration\n\nBouncie has a Zapier integration that allows you to connect Bouncie with other applications. You can use this integration to automate tasks and workflows between Bouncie and other applications without writing any code.\n\n### Setup\n\nTo use the Zapier integration, you will need to register an application on the [Bouncie Developer Portal](https://www.bouncie.dev/). Your application must have the following as a redirect URL:\n\n```\nhttps://zapier.com/dashboard/auth/oauth/return/App220583CLIAPI/\n```\n\nYou will be prompted to provide the application's `Client ID` and `Client Secret` when connecting your account while creating a Zap with a Bouncie trigger.\n\n**This application should only be used with the Zapier integration.**\n\n## FAQ\n\n### Why does the API return a 401 Unauthorized error?\n\n- The access token may be expired. See the [refresh an expired access token section](#3-refresh-an-expired-access-token) for more information on how to generate a fresh access token.\n- The Authorization header value may not be formatted correctly. Make sure to only include the access token and **not** the \"Bearer\" prefix.\n- The application may no longer have access to the user data that the access token was issued for. Verify the user shows up in the list in the Users & Devices tab for the application on the [Bouncie Developer Portal](https://www.bouncie.dev/).\n\n### How much data can I expect to receive from webhooks?\n\n- Data volume depends on the number of devices authorized to your account and how often the vehicles they are installed in are driven.\n- The specific events you subscribe to play a significant role in overall data volume. For example:\n  - `battery` events are sent only when battery voltage drops below a defined threshold.\n  - `tripMetrics` is reported once per trip, upon its conclusion.\n  - `tripData` events are transmitted continuously throughout the entirety of a trip and will make up the bulk of your data volume if enabled.\n- Devices may occasionally lose cellular connectivity — such as when operating in low-signal areas or parked underground. When this happens, trip data is temporarily stored on the device and transmitted once the connection is reestablished. Although the total volume of events remains unchanged, the data may be sent all at once over a short period of time. This can lead to brief spikes in webhook traffic.\n\n### Why do I receive duplicate trip events?\n\n- See the [trip data documentation](/webhooks/tripData/post#handling-message-data-duplication) for more details on why duplication happens and how to handle it properly in your application.\n\n### What happens if a webhook cannot be delivered?\n\n- If a webhook request times out or returns a 4xx or 5xx status code, Bouncie will automatically retry the request. Retries follow an exponential backoff policy to avoid overwhelming the receiving server. Retries will continue until a maximum number of attempts is reached.\n- If a webhook continues to fail after repeated retries, it will be automatically deactivated. This typically happens after prolonged periods of unresponsiveness or error responses. Once deactivated, no further events will be sent to that webhook URL until it is re-enabled.\n","version":"1.0.0"},"servers":[{"url":"https://api.bouncie.dev"}],"webhooks":{"deviceConnect":{"post":{"summary":"Device Connect","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["connect"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"connect":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"timeZone":{"type":["string"],"description":"Timezone of the event","example":"America/Chicago"},"latitude":{"type":["number"],"description":"Latitude of the event","example":32.7767432},"longitude":{"type":["number"],"description":"Longitude of the event","example":-96.7970123}},"required":["timestamp","timeZone","latitude","longitude"],"description":"Event data"}},"required":["eventType","imei","vin","connect"]}}}}}},"deviceDisconnect":{"post":{"summary":"Device Disconnect","description":"### Handling Device Disconnect Events\n\nBouncie devices generate Device Disconnect events when power to the device is removed — typically due to an unplug or tamper incident. These events notify developers that the device has lost external power, either intentionally or unexpectedly.\n\n#### Why Multiple Disconnect Events Occur\n\n- **Immediate Disconnect (Real-Time Notification):** The latest generation of Bouncie devices can transmit an immediate disconnect notification when power is removed, provided that network conditions allow. This enables real-time awareness of unplug or tamper events.\n\n- **Deferred Disconnect (Post-Reconnection Notification):** When network connectivity is unavailable at the moment of power loss, the device records the disconnect locally. Once power is restored and the device reconnects to the network, it transmits the stored disconnect event.\n\nBecause of this dual-reporting mechanism, developers may observe two Device Disconnect events for a single unplug or tamper incident:\n\n* One generated immediately when power is lost (if conditions allow)\n* One generated after power restoration and reconnection\n\n#### Best Practices\n* Treat multiple disconnect events as notifications of the same underlying unplug or tamper event and handle them gracefully within your application.","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["disconnect"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"disconnect":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"timeZone":{"type":["string"],"description":"Timezone of the event","example":"America/Chicago"},"latitude":{"type":["number"],"description":"Latitude of the event","example":32.7767432},"longitude":{"type":["number"],"description":"Longitude of the event","example":-96.7970123}},"required":["timestamp","timeZone","latitude","longitude"],"description":"Event data"}},"required":["eventType","imei","vin","disconnect"]}}}}}},"battery":{"post":{"summary":"Battery","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["battery"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"battery":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"value":{"type":["string"],"enum":["normal","low","critical"],"description":"One of: `normal`, `low`, or `critical"}},"required":["timestamp","value"],"description":"Event data"}},"required":["eventType","imei","vin","battery"]}}}}}},"mil":{"post":{"summary":"MIL","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["mil"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"mil":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"value":{"type":["string"],"enum":["ON"],"description":"Whether the MIL is on"},"codes":{"type":["string"],"description":"Diagnostic Trouble Codes (DTCs) for the vehicle","example":"P0420"}},"required":["timestamp","value","codes"],"description":"Event data"}},"required":["eventType","imei","vin","mil"]}}}}}},"vinChange":{"post":{"summary":"Vin Change","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["vinChange"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"2FTQX09L0XCA12345"},"vinChange":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"timeZone":{"type":["string"],"description":"Timezone of the event","example":"America/Chicago"},"oldVin":{"type":["string","null"],"description":"The VIN that the device had previously been reporting","example":"1HGBIQOJXMN109186"},"newVin":{"type":["string"],"description":"The VIN that the device has detected and is now reporting","example":"2FTQX09L0XCA12345"}},"required":["timestamp","timeZone","oldVin","newVin"],"description":"Event data"}},"required":["eventType","imei","vin","vinChange"]}}}}}},"tripStart":{"post":{"summary":"Trip Start","description":"### Handling Message Data Duplication\n\nBouncie communicates data through multiple streams to ensure both robust and timely reception of vehicle metrics. This includes periodic data transmissions that ensure reliable transmission of data and real-time data transmission for immediate updates. Due to this multi-stream approach, developers might observe instances of message data duplication.\n\n#### Why Duplication Occurs\n\n- **Real-Time Stream:** Designed for speed, this stream delivers data as it happens without waiting for previous messages to be confirmed. This will lead to data points that can overlap when paired with the regular transmissions from the Periodic Data stream.\n\n- **Periodic Stream:** Designed to ensure data integrity and order, this stream delivers data at regular intervals. As this data will overlap with the data received via the Real-Time Stream, some information will be replicated.\n\n#### Best Practices for Handling Duplications\n\n1. **Unique Identifiers (`transactionId`):** Each trip is associated with a `transactionId` serving as its unique identifier. We recommend implementing logic in your application to check for and discard any duplicated events based on these `transactionId` values.\n\n2. **Timestamp Analysis:** Utilize timestamps to determine the relevancy of data. In some cases, slightly older data received via the Periodic Stream might still be valuable for confirming the accuracy of data captured through the Real-Time Stream. In addition, there are circumstances in which the Periodic Data Stream may contain data that was unable to be transmitted via the Real-Time Stream.\n\nBy implementing these practices, developers can efficiently manage data duplication, ensuring the integrity and accuracy of the data processed in their applications. We're committed to providing a high-quality data stream to power your vehicle telematics solutions.\n","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["tripStart"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"transactionId":{"type":["string"],"description":"Unique identifier for the trip","example":"123456789012345-1735920000-202501"},"start":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T010:01:00.000Z"},"timeZone":{"type":["string"],"description":"Timezone of the event","example":"America/Chicago"},"odometer":{"type":["number"],"description":"Odometer reading at the start of the trip","example":45678.9}},"required":["timestamp","timeZone","odometer"],"description":"Event data"}},"required":["eventType","imei","vin","transactionId","start"]}}}}}},"tripData":{"post":{"summary":"Trip Data","description":"### Handling Message Data Duplication\n\nBouncie communicates data through multiple streams to ensure both robust and timely reception of vehicle metrics. This includes periodic data transmissions that ensure reliable transmission of data and real-time data transmission for immediate updates. Due to this multi-stream approach, developers might observe instances of message data duplication.\n\n#### Why Duplication Occurs\n\n- **Real-Time Stream:** Designed for speed, this stream delivers data as it happens without waiting for previous messages to be confirmed. This will lead to data points that can overlap when paired with the regular transmissions from the Periodic Data stream.\n\n- **Periodic Stream:** Designed to ensure data integrity and order, this stream delivers data at regular intervals. As this data will overlap with the data received via the Real-Time Stream, some information will be replicated.\n\n#### Best Practices for Handling Duplications\n\n1. **Unique Identifiers (`transactionId`):** Each trip is associated with a `transactionId` serving as its unique identifier. We recommend implementing logic in your application to check for and discard any duplicated events based on these `transactionId` values.\n\n2. **Timestamp Analysis:** Utilize timestamps to determine the relevancy of data. In some cases, slightly older data received via the Periodic Stream might still be valuable for confirming the accuracy of data captured through the Real-Time Stream. In addition, there are circumstances in which the Periodic Data Stream may contain data that was unable to be transmitted via the Real-Time Stream.\n\nBy implementing these practices, developers can efficiently manage data duplication, ensuring the integrity and accuracy of the data processed in their applications. We're committed to providing a high-quality data stream to power your vehicle telematics solutions.\n","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["tripData"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"transactionId":{"type":["string"],"description":"Unique identifier for the trip","example":"123456789012345-1735920000-202501"},"data":{"type":["array"],"items":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T010:01:00.000Z"},"speed":{"type":["number"],"description":"Speed of the vehicle in MPH","example":45},"gps":{"type":["object"],"properties":{"lat":{"type":["number"],"description":"Latitude of the vehicle","example":32.7767432},"lon":{"type":["number"],"description":"Longitude of the vehicle","example":-96.7970123},"heading":{"type":["number"],"description":"Heading of the vehicle","example":135}},"required":["lat","lon","heading"],"description":"GPS data"},"fuelLevelInput":{"type":["number"],"description":"Fuel level input","example":75.5}},"required":["timestamp","gps"]},"description":"Event data"}},"required":["eventType","imei","vin","transactionId","data"]}}}}}},"tripMetrics":{"post":{"summary":"Trip Metrics","description":"### Handling Message Data Duplication\n\nBouncie communicates data through multiple streams to ensure both robust and timely reception of vehicle metrics. This includes periodic data transmissions that ensure reliable transmission of data and real-time data transmission for immediate updates. Due to this multi-stream approach, developers might observe instances of message data duplication.\n\n#### Why Duplication Occurs\n\n- **Real-Time Stream:** Designed for speed, this stream delivers data as it happens without waiting for previous messages to be confirmed. This will lead to data points that can overlap when paired with the regular transmissions from the Periodic Data stream.\n\n- **Periodic Stream:** Designed to ensure data integrity and order, this stream delivers data at regular intervals. As this data will overlap with the data received via the Real-Time Stream, some information will be replicated.\n\n#### Best Practices for Handling Duplications\n\n1. **Unique Identifiers (`transactionId`):** Each trip is associated with a `transactionId` serving as its unique identifier. We recommend implementing logic in your application to check for and discard any duplicated events based on these `transactionId` values.\n\n2. **Timestamp Analysis:** Utilize timestamps to determine the relevancy of data. In some cases, slightly older data received via the Periodic Stream might still be valuable for confirming the accuracy of data captured through the Real-Time Stream. In addition, there are circumstances in which the Periodic Data Stream may contain data that was unable to be transmitted via the Real-Time Stream.\n\nBy implementing these practices, developers can efficiently manage data duplication, ensuring the integrity and accuracy of the data processed in their applications. We're committed to providing a high-quality data stream to power your vehicle telematics solutions.\n","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["tripMetrics"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"transactionId":{"type":["string"],"description":"Unique identifier for the trip","example":"123456789012345-1735920000-202501"},"metrics":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T010:01:00.000Z"},"tripTime":{"type":["number"],"description":"Duration of the trip in seconds","example":1800},"tripDistance":{"type":["number"],"description":"Distance travelled in miles","example":12.5},"totalIdlingTime":{"type":["number"],"description":"Total time spent idling in seconds","example":300},"maxSpeed":{"type":["number"],"description":"Maximum speed in MPH","example":65},"averageDriveSpeed":{"type":["number"],"description":"Average driving speed in MPH","example":35.5},"hardBrakingCounts":{"type":["number"],"description":"Number of hard braking events","example":2},"hardAccelerationCounts":{"type":["number"],"description":"Number of hard acceleration events","example":1}},"required":["timestamp","tripTime","tripDistance","totalIdlingTime","maxSpeed","averageDriveSpeed","hardBrakingCounts","hardAccelerationCounts"],"description":"Event data"}},"required":["eventType","imei","vin","transactionId","metrics"]}}}}}},"tripEnd":{"post":{"summary":"Trip End","description":"### Handling Message Data Duplication\n\nBouncie communicates data through multiple streams to ensure both robust and timely reception of vehicle metrics. This includes periodic data transmissions that ensure reliable transmission of data and real-time data transmission for immediate updates. Due to this multi-stream approach, developers might observe instances of message data duplication.\n\n#### Why Duplication Occurs\n\n- **Real-Time Stream:** Designed for speed, this stream delivers data as it happens without waiting for previous messages to be confirmed. This will lead to data points that can overlap when paired with the regular transmissions from the Periodic Data stream.\n\n- **Periodic Stream:** Designed to ensure data integrity and order, this stream delivers data at regular intervals. As this data will overlap with the data received via the Real-Time Stream, some information will be replicated.\n\n#### Best Practices for Handling Duplications\n\n1. **Unique Identifiers (`transactionId`):** Each trip is associated with a `transactionId` serving as its unique identifier. We recommend implementing logic in your application to check for and discard any duplicated events based on these `transactionId` values.\n\n2. **Timestamp Analysis:** Utilize timestamps to determine the relevancy of data. In some cases, slightly older data received via the Periodic Stream might still be valuable for confirming the accuracy of data captured through the Real-Time Stream. In addition, there are circumstances in which the Periodic Data Stream may contain data that was unable to be transmitted via the Real-Time Stream.\n\nBy implementing these practices, developers can efficiently manage data duplication, ensuring the integrity and accuracy of the data processed in their applications. We're committed to providing a high-quality data stream to power your vehicle telematics solutions.\n","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["tripEnd"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"transactionId":{"type":["string"],"description":"Unique identifier for the trip","example":"123456789012345-1735920000-202501"},"end":{"type":["object"],"properties":{"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T10:32:00.000Z"},"timeZone":{"type":["string"],"description":"Timezone of the event","example":"America/Chicago"},"odometer":{"type":["number"],"description":"Odometer reading at the end of the trip","example":45691.4},"fuelConsumed":{"type":["number"],"description":"Amount of fuel consumed in gallons","example":0.8}},"required":["timestamp","timeZone","odometer","fuelConsumed"],"description":"Event data"}},"required":["eventType","imei","vin","transactionId","end"]}}}}}},"applicationGeozone":{"post":{"summary":"Application Geo-Zone","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["applicationGeozone"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"transactionId":{"type":["string"],"description":"Unique identifier for the trip","example":"123456789012345-1735920000-202501"},"geozone":{"type":["object"],"properties":{"id":{"type":["string"],"description":"Unique identifier for the location that triggered the webhook","example":"65f8a2b4c9d7e1234567890a"},"name":{"type":["string"],"description":"The name of the location that triggered the webhook","example":"Home"},"event":{"type":["string"],"enum":["ENTER","EXIT"],"description":"The events that triggered the webhook","example":"ENTER"},"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"location":{"type":["object"],"properties":{"lat":{"type":["number"],"description":"Latitude of the event","example":32.7767432},"lon":{"type":["number"],"description":"Longitude of the event","example":-96.7970123},"heading":{"type":["number"],"description":"Heading of the vehicle","example":135}},"required":["lat","lon","heading"]}},"required":["id","name","event","timestamp","location"]}},"required":["eventType","imei","vin","transactionId","geozone"]}}}}}},"userGeozone":{"post":{"summary":"User Geo-Zone","requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"eventType":{"type":["string"],"enum":["userGeozone"],"description":"Event type"},"imei":{"type":["string"],"description":"IMEI of the device that sent the event","example":"123456789012345"},"vin":{"type":["string"],"description":"VIN of the vehicle that sent the event","example":"1HGBIQOJXMN109186"},"transactionId":{"type":["string"],"description":"Unique identifier for the trip","example":"123456789012345-1735920000-202501"},"geozone":{"type":["object"],"properties":{"id":{"type":["string"],"description":"Unique identifier for the location that triggered the webhook","example":"65f8a2b4c9d7e1234567890a"},"name":{"type":["string"],"description":"The name of the location that triggered the webhook","example":"Home"},"event":{"type":["string"],"enum":["ENTER","EXIT"],"description":"The events that triggered the webhook","example":"ENTER"},"timestamp":{"type":["string"],"format":"date-time","description":"Timestamp of the event","example":"2026-01-01T08:30:00.000Z"},"location":{"type":["object"],"properties":{"lat":{"type":["number"],"description":"Latitude of the event","example":32.7767432},"lon":{"type":["number"],"description":"Longitude of the event","example":-96.7970123},"heading":{"type":["number"],"description":"Heading of the vehicle","example":135}},"required":["lat","lon","heading"]}},"required":["id","name","event","timestamp","location"]}},"required":["eventType","imei","vin","transactionId","geozone"]}}}}}}},"paths":{"/v1/user":{"get":{"tags":["User"],"summary":"Get User","responses":{"200":{"description":"Returns user information for the user associated with the current access token","content":{"application/json":{"schema":{"type":["object"],"properties":{"email":{"type":["string"],"example":"john.doe@example.com"},"id":{"type":["string"],"example":"65f8a2b4c9d7e1234567890d"},"name":{"type":["string"],"example":"John Doe"}},"required":["email","id","name"]}}}}},"parameters":[{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/vehicles":{"get":{"tags":["Vehicle"],"summary":"Search Vehicles","responses":{"200":{"description":"Returns an array of vehicles matching the given criteria","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"model":{"type":["object"],"properties":{"make":{"type":["string"],"description":"Make of the vehicle","example":"Honda"},"name":{"type":["string"],"description":"Model name of the vehicle","example":"Accord"},"year":{"type":["number"],"description":"Model year of the vehicle","example":2022}},"required":["make","name","year"],"description":"Make and Model information for the vehicle"},"nickName":{"type":["string"],"description":"Nickname of the vehicle","example":"My Honda"},"standardEngine":{"type":["string"],"description":"Vehicle engine type","example":"1.5L 4-Cylinder Turbo"},"vin":{"type":["string"],"description":"Vehicle Identification Number for vehicle","example":"1HGBIQOJXMN109186"},"imei":{"type":["string"],"description":"Unique bouncie device identifier","example":"123456789012345"},"stats":{"type":["object"],"properties":{"localTimeZone":{"type":["string"],"description":"Timezone that the vehicle is currenly located","example":"America/Chicago"},"odometer":{"type":["number"],"description":"Current odometer reading of vehicle","example":45678.9},"lastUpdated":{"type":["string"],"format":"date-time","description":"Last time vehicle document was updated","example":"2026-01-01T08:30:00.000Z"},"location":{"type":["object"],"properties":{"lat":{"type":["number"],"description":"Latitude of vehicle","example":32.7767432},"lon":{"type":["number"],"description":"Longitude of vehicle","example":-96.7970123},"heading":{"type":["number"],"description":"Heading of vehicle","example":135},"address":{"type":["string"],"description":"Address of vehicle","example":"123 Main Street, Dallas, TX 75201"}},"required":["lat","lon","heading","address"],"description":"If available, last known location of vehicle"},"fuelLevel":{"type":["number"],"description":"Percentage of fuel remaining in tank as reported by vehicle","example":75.5},"isRunning":{"type":["boolean"],"description":"Indicates whether the vehicle is currently running","example":true},"speed":{"type":["number"],"description":"Current speed of vehicle","example":45},"mil":{"type":["object"],"properties":{"milOn":{"type":["boolean"],"description":"Whether the MIL is on for the vehicle","example":false},"lastUpdated":{"type":["string"],"format":"date-time","description":"Last date that MIL status was updated","example":"2026-01-01T08:30:00.000Z"},"qualifiedDtcList":{"type":["array"],"items":{"type":["object"],"properties":{"code":{"type":["string"],"description":"DTC code","example":"P0420"},"name":{"type":["array"],"items":{"type":["string"]},"description":"DTC names","example":["Catalyst System Efficiency Below Threshold"]}},"required":["code","name"]},"description":"List of Diagnostic Trouble Codes (DTCs) for the vehicle"},"battery":{"type":["object"],"properties":{"status":{"type":["string"],"enum":["normal","low","critical"],"description":"One of: `normal`, `low`, or `critical`","example":"normal"},"lastUpdated":{"type":["string"],"format":"date-time","description":"Last date that battery status was updated","example":"2026-01-01T08:30:00.000Z"}},"required":["status","lastUpdated"],"description":"Status of battery for vehicle"}},"required":["milOn","lastUpdated","qualifiedDtcList","battery"],"description":"Status of Malfunction Indicator Light (check engine light)"}},"required":["localTimeZone","odometer","lastUpdated","fuelLevel","isRunning","speed","mil"],"description":"Vehicle stats"}},"required":["model","nickName","standardEngine","vin","imei","stats"]}}}}}},"parameters":[{"in":"query","name":"vin","schema":{"type":["string"],"description":"Vehicle Identification Number for vehicle","example":"1HGBIQOJXMN109186"},"description":"Vehicle Identification Number for vehicle"},{"in":"query","name":"imei","schema":{"type":["string"],"description":"Unique bouncie device identifier","example":"123456789012345"},"description":"Unique bouncie device identifier"},{"in":"query","name":"limit","schema":{"type":["number"],"exclusiveMinimum":0,"description":"Number of search results to limit (for paging)","example":10},"description":"Number of search results to limit (for paging)"},{"in":"query","name":"skip","schema":{"type":["number"],"exclusiveMinimum":0,"description":"Number of search results to skip (for paging)","example":0},"description":"Number of search results to skip (for paging)"},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/trips":{"get":{"tags":["Trip"],"summary":"Search Trips","responses":{"200":{"description":"Returns an array of trips matching given criteria","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"transactionId":{"type":["string"],"description":"Unique identifier","example":"123456789012345-1735920000-202501"},"hardBrakingCount":{"type":["number"],"description":"Number of hard braking events","example":2},"hardAccelerationCount":{"type":["number"],"description":"Number of hard acceleration events","example":1},"distance":{"type":["number"],"description":"Distance travelled in miles","example":12.5},"gps":{"type":["string"],"description":"GPS data encoded in requested format","example":"_p~iF~ps|U_ulLnnqC_mqN"},"startTime":{"type":["string"],"format":"date-time","description":"Time trip started","example":"2026-01-01T010:01:00.000Z"},"endTime":{"type":["string"],"format":"date-time","description":"Time trip ended","example":"2026-01-01T10:32:00.000Z"},"startOdometer":{"type":["number"],"description":"Starting vehicle odometer","example":45678.9},"endOdometer":{"type":["number"],"description":"Ending vehicle odometer","example":45691.4},"averageSpeed":{"type":["number"],"description":"Average speed in MPH","example":35.5},"maxSpeed":{"type":["number"],"description":"Maximum speed in MPH","example":65},"fuelConsumed":{"type":["number"],"description":"Amount of fuel consumed in gallons","example":0.8},"timeZone":{"type":["string"],"description":"Time zone that vehicle was located in at the start of the trip","example":"America/Chicago"},"totalIdleDuration":{"type":["number"],"description":"Total time spent idling in seconds","example":300},"imei":{"type":["string"],"description":"Unique bouncie device identifier","example":"123456789012345"}},"required":["transactionId","hardBrakingCount","hardAccelerationCount","distance","gps","startTime","endTime","startOdometer","endOdometer","averageSpeed","maxSpeed","fuelConsumed","timeZone","totalIdleDuration","imei"]}}}}}},"parameters":[{"in":"query","name":"imei","schema":{"type":["string"],"description":"IMEI for the vehicle to retrieve trips for","example":"123456789012345"},"description":"IMEI for the vehicle to retrieve trips for"},{"in":"query","name":"transaction-id","schema":{"type":["string"],"description":"Unique Trip Identifier","example":"123456789012345-1735920000-202501"},"description":"Unique Trip Identifier"},{"in":"query","name":"gps-format","schema":{"type":["string"],"enum":["geojson","polyline"],"description":"One of: `polyline` or `geojson`","example":"polyline"},"description":"One of: `polyline` or `geojson`"},{"in":"query","name":"starts-after","schema":{"type":["string"],"format":"date-time","description":"Will match trips with a starting time after this parameter. The window between `starts-after` and `ends-before` must be no longer than a week. If not provided, the last week will be used by default","example":"2026-01-01T08:30:00.000Z"},"description":"Will match trips with a starting time after this parameter. The window between `starts-after` and `ends-before` must be no longer than a week. If not provided, the last week will be used by default"},{"in":"query","name":"ends-before","schema":{"type":["string"],"format":"date-time","description":"Will match trips with an ending time before this parameter","example":"2026-01-02T06:00:00.000Z"},"description":"Will match trips with an ending time before this parameter"},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Get Webhooks","responses":{"200":{"description":"Returns an array of webhooks for the current application","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"id":{"type":["string"],"description":"Unique identifier","example":"65f8a2b4c9d7e1234567890b"},"name":{"type":["string"],"description":"Name of the webhook","example":"Example Webhook"},"url":{"type":["string"],"description":"URL to send webhook events to","example":"https://www.exampleapp.com/webhook"},"authKey":{"type":["string"],"description":"Authorization key to use for webhook source verification","example":"9WVPxCzIUacIehyUKgJkqz4fQaZwnrs9DVy4yB"},"applicationId":{"type":["string"],"description":"Application ID that the webhook is associated with","example":"65f8a2b4c9d7e1234567890c"},"events":{"type":["array"],"items":{"type":["string"],"enum":["tripStart","tripData","tripEnd","tripMetrics","mil","battery","connect","disconnect","vinChange","userGeozone","applicationGeozone"]},"description":"List of events that the webhook is subscribed to","example":["tripStart","tripEnd"]},"active":{"type":["boolean"],"description":"Whether the webhook is active","example":true},"createdAt":{"type":["string"],"format":"date-time","description":"Time the webhook was created","example":"2026-01-01T08:30:00.000Z"},"updatedAt":{"type":["string"],"format":"date-time","description":"Time the webhook was last updated","example":"2026-01-01T08:30:00.000Z"}},"required":["id","name","url","authKey","applicationId","events","active","createdAt","updatedAt"]}}}}}},"parameters":[{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"post":{"tags":["Webhooks"],"summary":"Create Webhook","description":"Maximum number of webhooks per application is 100","responses":{"200":{"description":"Returns the created webhook","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"description":"Unique identifier","example":"65f8a2b4c9d7e1234567890b"},"name":{"type":["string"],"description":"Name of the webhook","example":"Example Webhook"},"url":{"type":["string"],"description":"URL to send webhook events to","example":"https://www.exampleapp.com/webhook"},"authKey":{"type":["string"],"description":"Authorization key to use for webhook source verification","example":"9WVPxCzIUacIehyUKgJkqz4fQaZwnrs9DVy4yB"},"applicationId":{"type":["string"],"description":"Application ID that the webhook is associated with","example":"65f8a2b4c9d7e1234567890c"},"events":{"type":["array"],"items":{"type":["string"],"enum":["tripStart","tripData","tripEnd","tripMetrics","mil","battery","connect","disconnect","vinChange","userGeozone","applicationGeozone"]},"description":"List of events that the webhook is subscribed to","example":["tripStart","tripEnd"]},"active":{"type":["boolean"],"description":"Whether the webhook is active","example":true},"createdAt":{"type":["string"],"format":"date-time","description":"Time the webhook was created","example":"2026-01-01T08:30:00.000Z"},"updatedAt":{"type":["string"],"format":"date-time","description":"Time the webhook was last updated","example":"2026-01-01T08:30:00.000Z"}},"required":["id","name","url","authKey","applicationId","events","active","createdAt","updatedAt"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"name":{"type":["string"],"description":"Name of the webhook","example":"Example Webhook"},"url":{"type":["string"],"format":"uri","description":"URL to send webhook events to","example":"https://www.exampleapp.com/webhook"},"authKey":{"type":["string"],"description":"Authorization key to use for webhook source verification","example":"9WVPxCzIUacIehyUKgJkqz4fQaZwnrs9DVy4yB"},"events":{"type":["array"],"items":{"type":["string"],"enum":["tripStart","tripData","tripEnd","tripMetrics","mil","battery","connect","disconnect","vinChange","userGeozone","applicationGeozone"]},"minItems":1,"description":"List of events that the webhook is subscribed to","example":["tripStart","tripEnd","mil"]},"active":{"default":true,"type":["boolean"],"description":"Whether the webhook is active","example":true}},"required":["name","url","authKey","events"]}}}},"parameters":[{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/webhooks/{webhookId}":{"put":{"tags":["Webhooks"],"summary":"Update Webhook","responses":{"200":{"description":"Returns the updated webhook","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"description":"Unique identifier","example":"65f8a2b4c9d7e1234567890b"},"name":{"type":["string"],"description":"Name of the webhook","example":"Example Webhook"},"url":{"type":["string"],"description":"URL to send webhook events to","example":"https://www.exampleapp.com/webhook"},"authKey":{"type":["string"],"description":"Authorization key to use for webhook source verification","example":"9WVPxCzIUacIehyUKgJkqz4fQaZwnrs9DVy4yB"},"applicationId":{"type":["string"],"description":"Application ID that the webhook is associated with","example":"65f8a2b4c9d7e1234567890c"},"events":{"type":["array"],"items":{"type":["string"],"enum":["tripStart","tripData","tripEnd","tripMetrics","mil","battery","connect","disconnect","vinChange","userGeozone","applicationGeozone"]},"description":"List of events that the webhook is subscribed to","example":["tripStart","tripEnd"]},"active":{"type":["boolean"],"description":"Whether the webhook is active","example":true},"createdAt":{"type":["string"],"format":"date-time","description":"Time the webhook was created","example":"2026-01-01T08:30:00.000Z"},"updatedAt":{"type":["string"],"format":"date-time","description":"Time the webhook was last updated","example":"2026-01-01T08:30:00.000Z"}},"required":["id","name","url","authKey","applicationId","events","active","createdAt","updatedAt"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"name":{"type":["string"],"description":"Name of the webhook","example":"Example Webhook"},"url":{"type":["string"],"format":"uri","description":"URL to send webhook events to","example":"https://www.exampleapp.com/webhook"},"authKey":{"type":["string"],"description":"Authorization key to use for webhook source verification","example":"9WVPxCzIUacIehyUKgJkqz4fQaZwnrs9DVy4yB"},"events":{"type":["array"],"items":{"type":["string"],"enum":["tripStart","tripData","tripEnd","tripMetrics","mil","battery","connect","disconnect","vinChange","userGeozone","applicationGeozone"]},"minItems":1,"description":"List of events that the webhook is subscribed to","example":["tripStart","tripEnd","mil"]},"active":{"default":true,"type":["boolean"],"description":"Whether the webhook is active","example":true}},"required":["name","url","authKey","events"]}}}},"parameters":[{"in":"path","name":"webhookId","schema":{"type":["string"],"pattern":"^:webhookId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"delete":{"tags":["Webhooks"],"summary":"Delete Webhook","responses":{"200":{"description":"Returns the deleted webhook","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"description":"Unique identifier","example":"65f8a2b4c9d7e1234567890b"},"name":{"type":["string"],"description":"Name of the webhook","example":"Example Webhook"},"url":{"type":["string"],"description":"URL to send webhook events to","example":"https://www.exampleapp.com/webhook"},"authKey":{"type":["string"],"description":"Authorization key to use for webhook source verification","example":"9WVPxCzIUacIehyUKgJkqz4fQaZwnrs9DVy4yB"},"applicationId":{"type":["string"],"description":"Application ID that the webhook is associated with","example":"65f8a2b4c9d7e1234567890c"},"events":{"type":["array"],"items":{"type":["string"],"enum":["tripStart","tripData","tripEnd","tripMetrics","mil","battery","connect","disconnect","vinChange","userGeozone","applicationGeozone"]},"description":"List of events that the webhook is subscribed to","example":["tripStart","tripEnd"]},"active":{"type":["boolean"],"description":"Whether the webhook is active","example":true},"createdAt":{"type":["string"],"format":"date-time","description":"Time the webhook was created","example":"2026-01-01T08:30:00.000Z"},"updatedAt":{"type":["string"],"format":"date-time","description":"Time the webhook was last updated","example":"2026-01-01T08:30:00.000Z"}},"required":["id","name","url","authKey","applicationId","events","active","createdAt","updatedAt"]}}}}},"parameters":[{"in":"path","name":"webhookId","schema":{"type":["string"],"pattern":"^:webhookId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/application-geozones/{applicationGeozoneId}":{"get":{"tags":["Application Geo-Zones"],"summary":"Get Application Geo-Zone By ID","responses":{"200":{"description":"Returns an application geozone","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier","example":"65f8a2b4c9d7e1234567890a"},"imei":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789012345"},"events":{"type":["array"],"items":{"type":["string"],"enum":["ENTER","EXIT"]},"minItems":1,"maxItems":2,"description":"Events that will trigger a webhook","example":["ENTER","EXIT"]},"locationId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location to alert on","example":"65f8a2b4c9d7e1234567890e"},"scheduleId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the schedule for when the geozone is active","example":"65f8a2b4c9d7e1234567890f"}},"required":["id","imei","events","locationId"]}}}},"404":{"description":"Responds with a status code of 404 if an application geozone could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"applicationGeozoneId","schema":{"type":["string"],"pattern":"^:applicationGeozoneId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"delete":{"tags":["Application Geo-Zones"],"summary":"Delete an Application Geo-Zone","responses":{"204":{"description":"Returns no content","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}},"404":{"description":"Responds with a status code of 404 if an application geozone could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"applicationGeozoneId","schema":{"type":["string"],"pattern":"^:applicationGeozoneId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/application-geozones/":{"get":{"tags":["Application Geo-Zones"],"summary":"Get Application Geo-Zones","responses":{"200":{"description":"Returns application geozones","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier","example":"65f8a2b4c9d7e1234567890a"},"imei":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789012345"},"events":{"type":["array"],"items":{"type":["string"],"enum":["ENTER","EXIT"]},"minItems":1,"maxItems":2,"description":"Events that will trigger a webhook","example":["ENTER","EXIT"]},"locationId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location to alert on","example":"65f8a2b4c9d7e1234567890e"},"scheduleId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the schedule for when the geozone is active","example":"65f8a2b4c9d7e1234567890f"}},"required":["id","imei","events","locationId"]}}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}}},"parameters":[{"in":"query","name":"imei","schema":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789101112"},"description":"IMEI of the device that will trigger the webhook"},{"in":"query","name":"locationId","schema":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location associated with the application geozone"},"description":"Unique identifier of the location associated with the application geozone"},{"in":"query","name":"scheduleId","schema":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the schedule associated with the application geozone"},"description":"Unique identifier of the schedule associated with the application geozone"},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"post":{"tags":["Application Geo-Zones"],"summary":"Create an Application Geo-Zone","responses":{"201":{"description":"Returns the created application geozone","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier","example":"65f8a2b4c9d7e1234567890a"},"imei":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789012345"},"events":{"type":["array"],"items":{"type":["string"],"enum":["ENTER","EXIT"]},"minItems":1,"maxItems":2,"description":"Events that will trigger a webhook","example":["ENTER","EXIT"]},"locationId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location to alert on","example":"65f8a2b4c9d7e1234567890e"},"scheduleId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the schedule for when the geozone is active","example":"65f8a2b4c9d7e1234567890f"}},"required":["id","imei","events","locationId"]}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}},"404":{"description":"Returns a status code of 404 if the device, location, or schedule could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"events":{"type":["array"],"items":{"type":["string"],"enum":["ENTER","EXIT"]},"minItems":1,"maxItems":2,"description":"Events that will trigger a webhook","example":["ENTER","EXIT"]},"imei":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789012345"},"locationId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location to alert on. See [Create a Location](../v1-locations/post)","example":"65f8a2b4c9d7e1234567890e"},"scheduleId":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the schedule for when the geozone is active. See [Create a Schedule](../v1-schedules/post)","example":"65f8a2b4c9d7e1234567890f"}},"required":["events","imei","locationId"],"additionalProperties":false}}}},"parameters":[{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/locations/{locationId}":{"get":{"tags":["Locations"],"summary":"Get Location By ID","responses":{"200":{"description":"Returns a location","content":{"application/json":{"schema":{"type":["object"],"properties":{"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"name":{"type":["string"],"description":"Name of the location","example":"Home"},"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location","example":"65f8a2b4c9d7e1234567890e"}},"required":["location","name","id"]}}}},"404":{"description":"Responds with a status code of 404 if a location could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"locationId","schema":{"type":["string"],"pattern":"^:locationId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"put":{"tags":["Locations"],"summary":"Update a Location","responses":{"200":{"description":"Returns the updated location","content":{"application/json":{"schema":{"type":["object"],"properties":{"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"name":{"type":["string"],"description":"Name of the location","example":"Home"},"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location","example":"65f8a2b4c9d7e1234567890e"}},"required":["location","name","id"]}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}},"404":{"description":"Responds with a status code of 404 if a location could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of your location which can either be a polygon or a point with a radius representing a circle\n\n_**Note:** You must provide the whole location object if you are updating any portion of it_"},"name":{"type":["string"],"description":"Name of the location","example":"Home"}},"additionalProperties":false}}}},"parameters":[{"in":"path","name":"locationId","schema":{"type":["string"],"pattern":"^:locationId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"delete":{"tags":["Locations"],"summary":"Delete a Location","responses":{"204":{"description":"Returns no content","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}},"404":{"description":"Responds with a status code of 404 if a location could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"locationId","schema":{"type":["string"],"pattern":"^:locationId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/locations/":{"get":{"tags":["Locations"],"summary":"Get Locations","responses":{"200":{"description":"Returns locations","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"name":{"type":["string"],"description":"Name of the location","example":"Home"},"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location","example":"65f8a2b4c9d7e1234567890e"}},"required":["location","name","id"]}}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}}},"parameters":[{"in":"query","name":"name","schema":{"type":["string"],"description":"Name of the location","example":"Home"},"description":"Name of the location"},{"in":"query","name":"id","schema":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique Identifier of the location","example":"65f8a2b4c9d7e1234567890e"},"description":"Unique Identifier of the location"},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"post":{"tags":["Locations"],"summary":"Create a Location","responses":{"201":{"description":"Returns the created location","content":{"application/json":{"schema":{"type":["object"],"properties":{"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"name":{"type":["string"],"description":"Name of the location","example":"Home"},"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier of the location","example":"65f8a2b4c9d7e1234567890e"}},"required":["location","name","id"]}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"name":{"type":["string"],"description":"Name of the location","example":"Home"}},"required":["location","name"],"additionalProperties":false}}}},"parameters":[{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/schedules/{scheduleId}":{"get":{"tags":["Schedules"],"summary":"Get Schedule By ID","responses":{"200":{"description":"Returns a schedule","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier for the schedule","example":"65f8a2b4c9d7e1234567890f"},"name":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"referenceTz":{"type":["string"],"description":"[Time zone identifier](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the schedule","example":"America/Chicago"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"minItems":1,"description":"The different schedules that will trigger an event","example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["id","name","referenceTz","schedule"]}}}},"404":{"description":"Responds with a status code of 404 if a schedule could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"scheduleId","schema":{"type":["string"],"pattern":"^:scheduleId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"put":{"tags":["Schedules"],"summary":"Update a Schedule","responses":{"200":{"description":"Returns the updated schedule","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier for the schedule","example":"65f8a2b4c9d7e1234567890f"},"name":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"referenceTz":{"type":["string"],"description":"[Time zone identifier](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the schedule","example":"America/Chicago"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"minItems":1,"description":"The different schedules that will trigger an event","example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["id","name","referenceTz","schedule"]}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}},"404":{"description":"Responds with a status code of 404 if a schedule could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"name":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"referenceTz":{"type":["string"],"description":"[Time zone identifier](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the schedule","example":"America/Chicago"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"minItems":1,"description":"The different schedules that will trigger an event","example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"additionalProperties":false}}}},"parameters":[{"in":"path","name":"scheduleId","schema":{"type":["string"],"pattern":"^:scheduleId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"delete":{"tags":["Schedules"],"summary":"Delete a schedule","responses":{"204":{"description":"Returns no content","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}},"404":{"description":"Responds with a status code of 404 if a schedule could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"scheduleId","schema":{"type":["string"],"pattern":"^:scheduleId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/schedules/":{"get":{"tags":["Schedules"],"summary":"Get Schedules","responses":{"200":{"description":"Returns schedules","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier for the schedule","example":"65f8a2b4c9d7e1234567890f"},"name":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"referenceTz":{"type":["string"],"description":"[Time zone identifier](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the schedule","example":"America/Chicago"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"minItems":1,"description":"The different schedules that will trigger an event","example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["id","name","referenceTz","schedule"]}}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}}},"parameters":[{"in":"query","name":"id","schema":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique ID of the schedule","example":"65f8a2b4c9d7e1234567890f"},"description":"Unique ID of the schedule"},{"in":"query","name":"name","schema":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"description":"Name of the schedule"},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]},"post":{"tags":["Schedules"],"summary":"Create a Schedule","responses":{"201":{"description":"Returns the created schedule","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier for the schedule","example":"65f8a2b4c9d7e1234567890f"},"name":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"referenceTz":{"type":["string"],"description":"[Time zone identifier](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the schedule","example":"America/Chicago"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"minItems":1,"description":"The different schedules that will trigger an event","example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["id","name","referenceTz","schedule"]}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":["object"],"properties":{"name":{"type":["string"],"description":"Name of the schedule","example":"Weekday Work Hours"},"referenceTz":{"type":["string"],"description":"[Time zone identifier](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the schedule","example":"America/Chicago"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"minItems":1,"description":"The different schedules that will trigger an event","example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["name","referenceTz","schedule"],"additionalProperties":false}}}},"parameters":[{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/user-geozones/{userGeozoneId}":{"get":{"tags":["User Geo-Zones"],"summary":"Get User Geo-Zone By ID","responses":{"200":{"description":"Returns a user geozone","content":{"application/json":{"schema":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier","example":"65f8a2b4c9d7e1234567890a"},"imei":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789101112"},"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["id","imei","location","schedule"]}}}},"404":{"description":"Responds with a status code of 404 if a user geozone could not be found","content":{"application/json":{"schema":{"type":["string","null"],"enum":["null"]}}}}},"parameters":[{"in":"path","name":"userGeozoneId","schema":{"type":["string"],"pattern":"^:userGeozoneId$"},"required":true},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}},"/v1/user-geozones/":{"get":{"tags":["User Geo-Zones"],"summary":"Get User Geo-Zones","responses":{"200":{"description":"Returns user geozones","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["object"],"properties":{"id":{"type":["string"],"minLength":24,"maxLength":24,"pattern":"[A-Za-z0-9]","description":"Unique identifier","example":"65f8a2b4c9d7e1234567890a"},"imei":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789101112"},"location":{"oneOf":[{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"Type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Polygon"],"description":"Type must be \"Polygon\" for polygon representations"},"coordinates":{"type":["array"],"items":{"type":["array"],"items":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"minItems":1,"maxItems":1,"description":"An array containing a single linear ring representing the boundaries of the polygon (see [GeoJSON standard](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6))"}},"required":["type","coordinates"],"description":"The geometry representing the polygon"}},"required":["type","geometry"],"title":"Polygon","example":{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-96.7980123,32.7760432],[-96.7960123,32.7760432],[-96.7960123,32.7750432],[-96.7980123,32.7750432],[-96.7980123,32.7760432]]]}}},{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Feature"],"description":"The type must be \"Feature\""},"geometry":{"type":["object"],"properties":{"type":{"type":["string"],"enum":["Point"],"description":"The type must be \"Point\" to represent the center of the circle"},"coordinates":{"type":["array"],"items":{"type":["number"]},"minItems":2,"maxItems":2,"description":"Array with [longitude, latitude] _in that specific order_","example":[-96.7970123,32.7767432]}},"required":["type","coordinates"],"description":"A point representing the center of the circle"},"properties":{"type":["object"],"properties":{"subType":{"type":["string"],"enum":["Circle"],"description":"The subType must be \"Circle\" for circles"},"radius":{"type":["number"],"exclusiveMinimum":0,"description":"The radius of the circle in meters","example":100}},"required":["subType","radius"],"description":"Properties of the circle"}},"required":["type","geometry","properties"],"title":"Point","example":{"type":"Feature","geometry":{"type":"Point","coordinates":[-96.7970123,32.7767432]},"properties":{"subType":"Circle","radius":100}}}],"description":"A [GeoJSON feature](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2) representation of the location which can either be a polygon or a point with a radius representing a circle"},"schedule":{"type":["array"],"items":{"type":["object"],"properties":{"daysOfWeek":{"type":["array"],"items":{"type":["integer"],"minimum":0,"maximum":6},"minItems":1,"maxItems":7,"description":"Days of the week the schedule times are active where 0 represents Sunday and 6 represents Saturday.","example":[1,2,3,4,5]},"times":{"type":["array"],"items":{"type":["object"],"properties":{"startTime":{"type":["integer"],"minimum":0,"maximum":86400,"example":28800},"endTime":{"type":["integer"],"exclusiveMinimum":0,"maximum":86400,"example":61200}},"required":["startTime","endTime"]},"minItems":1,"description":"The time segments throughout the day represented in seconds that the schedule is active.","example":[{"startTime":28800,"endTime":61200}]}},"required":["daysOfWeek","times"]},"example":[{"daysOfWeek":[1,2,3,4,5],"times":[{"startTime":28800,"endTime":61200}]}]}},"required":["id","imei","location","schedule"]}}}}},"400":{"description":"Returns a list of validation errors","content":{"application/json":{"schema":{"type":["array"],"items":{"type":["string"]},"description":"List of validation errors","example":"String must contain exactly 24 character(s)"}}}}},"parameters":[{"in":"query","name":"imei","schema":{"type":["string"],"minLength":15,"maxLength":15,"pattern":"\\d","description":"IMEI of the device that will trigger the webhook","example":"123456789101112"},"description":"IMEI of the device that will trigger the webhook"},{"in":"header","name":"Authorization","schema":{"type":["string"],"description":"User access token"},"description":"User access token"},{"in":"header","name":"Content-Type","schema":{"type":["string"],"enum":["application/json"]}}]}}}}