openapi: 3.0.1 info: title: m3ter Account Aggregation API description: "If you are using Postman, you can:\n- Use the **Download** button above to download the m3ter Open API spec JSON file and then import this file as the **m3ter API Collection** into your Workspace. See [Importing the m3ter Open API](https://www.m3ter.com/docs/guides/m3ter-apis/getting-started-with-api-calls#importing-the-m3ter-open-api) in our main user Documentation for details.\n- Copy this link: [m3ter-Template API Collection](https://www.datocms-assets.com/78893/1672846767-m3ter-template-api-collection-postman_collection.json) and use it to import the **m3ter-Template API Collection** into your Workspace. See [Importing the m3ter Template API Collection](https://www.m3ter.com/docs/guides/m3ter-apis/getting-started-with-api-calls#importing-the-m3ter-template-api-collection) in our main user Documentation for details.\n\n---\n\n# Introduction\nThe m3ter platform supports two HTTP-based REST APIs returning JSON encoded responses:\n- The **Ingest API**, which you can use for submitting raw data measurements. *(See the [Submit Measurements](https://www.m3ter.com/docs/api#tag/Measurements/operation/SubmitMeasurements) endpoint in this API Reference.)*\n- The **Config API**, which you can use for configuration and management. *(All other endpoints in this API Reference.)* \n\n## Authentication and Authorization\nOur APIs use an industry-standard authorization protocol known as the OAuth 2.0 specification.\n\nOAuth2 supports several grant types, each designed for a specific use case. m3ter uses the following two grant types:\n - **Authorization Code**: Used for human login access via the m3ter Console.\n - **Client Credentials**: Used for machine-to-machine communication and API access.\n\nComplete the following flow for API access:\n\n1. **Create a Service User and add Permissions**: Log in to the m3ter Console, go to **Settings**, **Access** then **Service Users** tab, and create a Service User. To enable API calls, grant the user **Administrator** permissions. \n \n2. **Generate Access Keys**: In the Console, open the *Overview* page for the Service User by clicking on the name. Generate an **Access Key id** and **Api Secret**. Make sure you copy the **Api Secret** because it is only visible at the time of creation. \n\nSee [Service Authentication](https://www.m3ter.com/docs/guides/authenticating-with-the-platform/service-authentication) for detailed instructions and an example.\n\n3. **Obtain a Bearer Token using Basic Auth**: We implement the OAuth 2.0 Client Credentials Grant authentication flow for Service User Authentication. Submit a request to the m3ter OAuth Client Credentials authentication flow, using your concatenated **Access Key id** and **Api Secret** to obtain a Bearer Token for your Service User. *See examples below.* \n \n4. **Bearer Token Usage**: Use the HTTP 'Authorization' header with the bearer token to authorise all subsequent API requests. \n\n> Warning: The Bearer Token is valid for 18,000 seconds or 5 hours. When the token has expired, you must obtain a new one.\n\nBelow are two examples for obtaining a Bearer Token using Basic Auth: the first in cURL and the second as a Python script. \n\n### cURL Example\n1. Open your terminal or command prompt. \n2. Use the following `cURL` command to obtain a Bearer Token:\n\n```bash\ncurl -X POST https://api.m3ter.com/oauth/token \\\n -H 'Content-Type: application/x-www-form-urlencoded' \\\n -u your_access_key_id:your_api_secret \\\n -d 'grant_type=client_credentials'\n```\n\nReplace `your_access_key_id` and `your_api_secret` with your actual **Access Key id** and **Api Secret**.\n\n3. Run the command, and if successful, it will return a JSON response containing the Bearer Token. The response will look like this:\n\n```json\n{\n \"access_token\": \"your_bearer_token\",\n \"token_type\": \"Bearer\",\n \"expires_in\": 18000\n}\n```\n\nYou can then use the Bearer Token *(the value of `\"access_token\"`)* for subsequent API calls to m3ter.\n\n### Python Example\n1. Install the `requests` library if you haven't already:\n\n```bash\npip install requests\n```\n\n2. Use the following Python script to obtain a Bearer Token:\n\n```python\nimport requests\nimport base64\n\n# Replace these with your Access Key id and Api Secret\naccess_key_id = 'your_access_key_id'\napi_secret = 'your_api_secret'\n\n# Encode the Access Key id and Api Secret in base64 format\ncredentials = base64.b64encode(f'{access_key_id}:{api_secret}'.encode('utf-8')).decode('utf-8')\n\n# Set the m3ter token endpoint URL\ntoken_url = 'https://api.m3ter.com/oauth/token'\n\n# Set the headers for the request\nheaders = {\n 'Authorization': f'Basic {credentials}',\n 'Content-Type': 'application/x-www-form-urlencoded'\n}\n\n# Set the payload for the request\npayload = {\n 'grant_type': 'client_credentials'\n}\n\n# Send the request to obtain the Bearer Token\nresponse = requests.post(token_url, headers=headers, data=payload)\n\n# Check if the request was successful\nif response.status_code == 200:\n # Extract the Bearer Token from the response\n bearer_token = response.json()['access_token']\n print(f'Bearer Token: {bearer_token}')\nelse:\n print(f'Error: {response.status_code} - {response.text}')\n```\n\nReplace `your_access_key_id` and `your_api_secret` with your actual **Access Key id** and **Api Secret**. \n\n3. Run the script, and if successful, it will print the Bearer Token. You can then use this Bearer Token for subsequent API calls to m3ter.\n\n## Submitting Personally Identifiable Information (PII)\n**IMPORTANT!** Under the [Data Processing Agreement](https://www.m3ter.com/docs/legal/dpa), the only fields permissible for use in submitting any of your end-customer PII data in m3ter are the ``name``, ``address``, and ``emailAddress`` fields on the **Account** entity - see the details for [Create Account](https://www.m3ter.com/docs/api#operation/PostAccount). See also section 4.2 of the [Terms of Service](https://www.m3ter.com/docs/legal/terms-of-service).\n\n## Rate and Payload Limits\n### Config API Request Rate Limits\nSee [Config API Limits](https://www.m3ter.com/docs/guides/m3ter-apis/config-api-limits).\n\n### Data Explorer API Request Rate Limits\nSee [Data Explorer Request Rate Limits](https://www.m3ter.com/docs/guides/m3ter-apis/config-api-limits#date-explorer-request-rate-limits).\n\n### Ingest API Request Rate and Payload Limits\nSee [Ingest API Limits](https://www.m3ter.com/docs/guides/m3ter-apis/ingest-api-limits) for more information.\n\n## Pagination\n**List Endpoints**\nAPI endpoints that have a List resources request support cursor-based pagination - for example, the `List Accounts` request. These List calls support pagination by taking the two parameters `pageSize` and `nextToken`. \n\nThe response of a List API call is a single page list. If the `nextToken` parameter is not supplied, the first page returned contains the newest objects chronologically. Specify a `nextToken` to retrieve the page of older objects that occur immediately after the last object on the previous page.\n\nUse `pageSize` to limit the list results per page, typically this allows up to a maximum of 100 or 200 per page.\n\n**Search Endpoints**\nAPI endpoints that have a Search resources request support cursor-based pagination - for example, the `Search Accounts` request. These Search calls support pagination by taking the two parameters `pageSize` and `fromDocument`.\n\nThe response of a Search API call is a single page list. If the `fromDocument` parameter is not supplied, the first page returned contains the newest objects chronologically. Specify a `fromDocument` to retrieve the page of older objects that occur immediately after the last object on the previous page.\n\nUse `pageSize` to limit the list results per page, typically this allows up to a maximum of 100 or 200 per page. Default is 10.\n\n## API Quick Start\nSee [Getting Started with API Calls](https://www.m3ter.com/docs/guides/m3ter-apis/getting-started-with-api-calls) for detailed guidance on how to use our API to:\n* Create a Service User and add permissions.\n* Generate access keys for the Service User.\n* Use basic authentication to obtain a Bearer Token.\n\nFor further guidance, also see [Creating and Configuring Service Users](https://www.m3ter.com/docs/guides/organization-and-access-management/managing-users/creating-and-configuring-service-users).\n\n## Other Languages\nIf you want to work with the m3ter REST APIs using other languages such as:\n* Python\n* JavaScript\n* C++\n\nPlease see the [Developer Tools](https://www.m3ter.com/docs/guides/developer-tools) topic in our main documentation for information about available SDKs.\n\n\n# Authentication\n" version: '1.0' x-logo: url: https://console.m3ter.com/m3ter-logo-black.svg servers: - url: https://api.m3ter.com security: - OAuth2: [] tags: - name: Aggregation description: "Endpoints for listing, creating, updating, retrieving, or deleting Aggregations.\n\nAn Aggregation links to a Meter and targets a Data Field or Derived Field on the Meter. You define the method of aggregation used to convert the usage data collected by the targeted Meter field into a numerical unit of measurement. \n\nYou can then use the unit of measurement an Aggregation yields as a metric for pricing Product Plans and apply usage-based pricing to your products and services. You might also want to aggregate raw data measures for other purposes, such as to feed into analytical or business performance tools.\n\n**Notes:**\n* **Contrast with Compound Aggregations**. Standard or simple Aggregations of this type, which apply an aggregation method directly to Meter usage data fields, are contrasted with [Compound Aggregations](https://www.m3ter.com/docs/api#tag/CompoundAggregation). A Compound Aggregation typically references one or more simple Aggregations and applies a calculation to them to derive pricing metrics needed to serve more complex usage-based pricing scenarios.\n* **Segmented Aggregations**. Segmented Aggregations allow you to segment the usage data collected by a single Meter. This capability is very useful for implementing some pricing and billing use cases. See [Segmented Aggregations](https://www.m3ter.com/docs/guides/usage-data-aggregations/segmented-aggregations) in our main documentation for more details.\n" paths: /organizations/{orgId}/aggregations: get: tags: - Aggregation summary: List Aggregations description: Retrieve a list of Aggregations that can be filtered by Product, Aggregation ID, or Code. operationId: ListAggregations parameters: - name: orgId in: path description: UUID of the Organization. The Organization represents your company as a direct customer of the m3ter service. required: true style: simple explode: false schema: type: string deprecated: true x-stainless-deprecation-message: the org id should be set at the client level instead - name: pageSize in: query description: Number of Aggregations to retrieve per page. required: false allowEmptyValue: true style: form explode: true schema: maximum: 100 minimum: 1 type: integer format: int32 - name: nextToken in: query description: '`nextToken` for multi-page retrievals.' required: false allowEmptyValue: true style: form explode: true schema: type: string - name: productId in: query description: The UUIDs of the Products to retrieve Aggregations for. required: false allowEmptyValue: true style: form explode: true schema: type: array items: type: string - name: ids in: query description: List of Aggregation IDs to retrieve. required: false allowEmptyValue: true style: form explode: true schema: type: array items: type: string - name: codes in: query description: List of Aggregation codes to retrieve. These are unique short codes to identify each Aggregation. required: false allowEmptyValue: true style: form explode: true schema: type: array items: type: string responses: '200': description: 'Returns the list of Aggregations ' content: application/json: schema: $ref: '#/components/schemas/PaginatedAggregationResponseData' 4XX: $ref: '#/components/responses/Error' 5XX: $ref: '#/components/responses/Error' post: tags: - Aggregation summary: Create Aggregation description: Create a new Aggregation. operationId: PostAggregation parameters: - name: orgId in: path description: 'UUID of the Organization. The Organization represents your company as a direct customer of the m3ter service. ' required: true style: simple explode: false schema: type: string deprecated: true x-stainless-deprecation-message: the org id should be set at the client level instead requestBody: description: '' content: application/json: schema: $ref: '#/components/schemas/AggregationRequest' required: true responses: '200': description: Return the created Aggregation content: application/json: schema: $ref: '#/components/schemas/AggregationResponse' 4XX: $ref: '#/components/responses/Error' 5XX: $ref: '#/components/responses/Error' /organizations/{orgId}/aggregations/{id}: get: tags: - Aggregation summary: Retrieve Aggregation description: Retrieve the Aggregation with the given UUID. operationId: GetAggregation parameters: - name: orgId in: path description: UUID of the Organization. The Organization represents your company as a direct customer of the m3ter service. required: true style: simple explode: false schema: type: string deprecated: true x-stainless-deprecation-message: the org id should be set at the client level instead - name: id in: path description: The UUID of the Aggregation to retrieve. required: true style: simple explode: false schema: type: string responses: '200': description: Return the Aggregation content: application/json: schema: $ref: '#/components/schemas/AggregationResponse' 4XX: $ref: '#/components/responses/Error' 5XX: $ref: '#/components/responses/Error' put: tags: - Aggregation summary: Update Aggregation description: 'Update the Aggregation with the given UUID. **Note:** If you have created Custom Fields for an Aggregation, when you use this endpoint to update the Aggregation use the `customFields` parameter to preserve those Custom Fields. If you omit them from the update request, they will be lost.' operationId: PutAggregation parameters: - name: orgId in: path description: UUID of the Organization. The Organization represents your company as a direct customer of the m3ter service. required: true style: simple explode: false schema: type: string deprecated: true x-stainless-deprecation-message: the org id should be set at the client level instead - name: id in: path description: The UUID of the Aggregation to update. required: true style: simple explode: false schema: type: string requestBody: description: '' content: application/json: schema: $ref: '#/components/schemas/AggregationRequest' required: true responses: '200': description: Return the updated Aggregation content: application/json: schema: $ref: '#/components/schemas/AggregationResponse' 4XX: $ref: '#/components/responses/Error' 5XX: $ref: '#/components/responses/Error' delete: tags: - Aggregation summary: Delete Aggregation description: Delete the Aggregation with the given UUID. operationId: DeleteAggregation parameters: - name: orgId in: path description: UUID of the Organization. The Organization represents your company as a direct customer of the m3ter service. required: true style: simple explode: false schema: type: string deprecated: true x-stainless-deprecation-message: the org id should be set at the client level instead - name: id in: path description: The UUID of the Aggregation to delete. required: true style: simple explode: false schema: type: string responses: '200': description: Return the deleted Aggregation content: application/json: schema: $ref: '#/components/schemas/AggregationResponse' 4XX: $ref: '#/components/responses/Error' 5XX: $ref: '#/components/responses/Error' components: schemas: AbstractAggregationRequest: type: object description: '' allOf: - $ref: '#/components/schemas/AbstractRequestWithCustomFields' - $ref: '#/components/schemas/AbstractRequest' - required: - name - quantityPerUnit - rounding - unit properties: version: type: integer description: 'The version number of the Aggregation: - **Create entity:** Not valid for initial insertion of new Aggregation - *do not use for Create*. On initial Create, version is set at 1 and listed in the response. - **Update Entity:** On Update, version is required and must match the existing version because a check is performed to ensure sequential versioning is preserved. Version is incremented by 1 and listed in the response.' format: int64 x-stainless-terraform-configurability: computed x-stainless-terraform-always-send: true name: maxLength: 200 minLength: 1 type: string description: Descriptive name for the Aggregation. rounding: description: "Specifies how you want to deal with non-integer, fractional number Aggregation values.\n\n**NOTES:**\n* **NEAREST** rounds to the nearest half: 5.1 is rounded to 5, and 3.5 is rounded to 4.\n* Also used in combination with `quantityPerUnit`. Rounds the number of units after `quantityPerUnit` is applied. If you set `quantityPerUnit` to a value other than one, you would typically set Rounding to **UP**. For example, suppose you charge by kilobytes per second (KiBy/s), set `quantityPerUnit` = 500, and set charge rate at $0.25 per unit used. If your customer used 48,900 KiBy/s in a billing period, the charge would be 48,900 / 500 = 97.8 rounded up to 98 * 0.25 = $2.45.\n\nEnum: ???UP??? ???DOWN??? ???NEAREST??? ???NONE???\n\n " $ref: '#/components/schemas/Rounding' quantityPerUnit: minimum: 0 exclusiveMinimum: true type: number description: 'Defines how much of a quantity equates to 1 unit. Used when setting the price per unit for billing purposes - if charging for kilobytes per second (KiBy/s) at rate of $0.25 per 500 KiBy/s, then set quantityPerUnit to 500 and price Plan at $0.25 per unit. **Note:** If `quantityPerUnit` is set to a value other than one, `rounding` is typically set to `"UP"`.' unit: maxLength: 50 minLength: 1 type: string description: User defined label for units shown for Bill line items, indicating to your customers what they are being charged for. code: maxLength: 80 pattern: ^[\p{L}_$][\p{L}_$0-9]*$ type: string description: Code of the new Aggregation. A unique short code to identify the Aggregation. example: example_code accountingProductId: maxLength: 36 minLength: 36 type: string description: Optional Product ID this Aggregation should be attributed to for accounting purposes. PaginatedAggregationResponseData: type: object properties: data: type: array description: '' items: $ref: '#/components/schemas/AggregationResponse' nextToken: type: string description: '' description: '' Aggregation: type: string description: 'Specifies the computation method applied to usage data collected in `targetField`. Aggregation unit value depends on the **Category** configured for the selected targetField. * **SUM**. Adds the values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. * **MIN**. Uses the minimum value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. * **MAX**. Uses the maximum value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. * **COUNT**. Counts the number of values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. * **LATEST**. Uses the most recent value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. Note: Based on the timestamp `ts` value of usage data measurement submissions. If using this method, please ensure *distinct* `ts` values are used for usage data measurement submissions. * **MEAN**. Uses the arithmetic mean of the values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. * **UNIQUE**. Uses unique values and returns a count of the number of unique values. Can be applied to a **Metadata** `targetField`.' enum: - SUM - MIN - MAX - COUNT - LATEST - MEAN - UNIQUE - CUSTOM_SQL AbstractRequestWithCustomFields: type: object description: '' allOf: - $ref: '#/components/schemas/AbstractRequest' - properties: customFields: type: object description: 'User defined fields enabling you to attach custom data. The value for a custom field can be either a string or a number. If `customFields` can also be defined for this entity at the Organizational level, `customField` values defined at individual level override values of `customFields` with the same name defined at Organization level. See [Working with Custom Fields](https://www.m3ter.com/docs/guides/creating-and-managing-products/working-with-custom-fields) in the m3ter documentation for more information.' maxItems: 100 additionalProperties: anyOf: - title: StringCustomFieldReq type: string - title: IntegerCustomFieldReq type: integer - title: NumberCustomFieldReq type: number AbstractResponse: required: - id type: object properties: id: type: string description: 'The UUID of the entity. ' version: type: integer description: 'The version number: - **Create:** On initial Create to insert a new entity, the version is set at 1 in the response. - **Update:** On successful Update, the version is incremented by 1 in the response.' format: int64 x-stainless-terraform-configurability: computed x-stainless-terraform-always-send: true description: '' AggregationResponse: type: object description: '' allOf: - $ref: '#/components/schemas/AbstractAggregationResponse' - $ref: '#/components/schemas/AbstractResponseWithCustomFields' - $ref: '#/components/schemas/AbstractResponse' - properties: meterId: type: string description: 'The UUID of the Meter used as the source of usage data for the Aggregation. Each Aggregation is a child of a Meter, so the Meter must be selected. ' targetField: type: string description: '`Code` of the target `dataField` or `derivedField` on the Meter used as the basis for the Aggregation.' aggregation: description: "Specifies the computation method applied to usage data collected in `targetField`. Aggregation unit value depends on the **Category** configured for the selected targetField.\n\nEnum: \n\n* **SUM**. Adds the values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **MIN**. Uses the minimum value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **MAX**. Uses the maximum value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **COUNT**. Counts the number of values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **LATEST**. Uses the most recent value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. Note: Based on the timestamp (`ts`) value of usage data measurement submissions. If using this method, please ensure *distinct* `ts` values are used for usage data measurment submissions.\n\n* **MEAN**. Uses the arithmetic mean of the values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **UNIQUE**. Uses unique values and returns a count of the number of unique values. Can be applied to a **Metadata** `targetField`.\n\n* **CUSTOM_SQL**. Uses an SQL query expression. The `customSQL` parameter is used for the SQL query." $ref: '#/components/schemas/Aggregation' segmentedFields: type: array description: '*(Optional)*. Used when creating a segmented Aggregation, which segments the usage data collected by a single Meter. Works together with `segments`. The `Codes` of the fields in the target Meter to use for segmentation purposes. String `dataFields` on the target Meter can be segmented. Any string `derivedFields` on the target Meter, such as one that concatenates two string `dataFields`, can also be segmented.' items: type: string defaultValue: type: number description: 'Aggregation value used when no usage data is available to be aggregated. *(Optional)*. **Note:** Set to 0, if you expect to reference the Aggregation in a Compound Aggregation. This ensures that any null values are passed in correctly to the Compound Aggregation calculation with a value = 0.' customSql: type: string description: The SQL query expression to be used for a Custom SQL Aggregation. dtCreated: type: string description: The DateTime when the aggregation was created *(in ISO 8601 format)*. format: date-time x-stainless-skip: - terraform dtLastModified: type: string description: The DateTime when the aggregation was last modified *(in ISO 8601 format)*. format: date-time x-stainless-skip: - terraform createdBy: type: string description: The id of the user who created this aggregation. x-stainless-skip: - terraform lastModifiedBy: type: string description: The id of the user who last modified this aggregation. x-stainless-skip: - terraform AbstractRequest: type: object properties: version: type: integer description: 'The version number of the entity: - **Create entity:** Not valid for initial insertion of new entity - *do not use for Create*. On initial Create, version is set at 1 and listed in the response. - **Update Entity:** On Update, version is required and must match the existing version because a check is performed to ensure sequential versioning is preserved. Version is incremented by 1 and listed in the response.' format: int64 x-stainless-terraform-configurability: computed x-stainless-terraform-always-send: true description: '' AbstractAggregationResponse: type: object description: '' allOf: - $ref: '#/components/schemas/AbstractResponseWithCustomFields' - $ref: '#/components/schemas/AbstractResponse' - properties: name: type: string description: Descriptive name for the Aggregation. rounding: description: 'Specifies how you want to deal with non-integer, fractional number Aggregation values. **NOTES:** * **NEAREST** rounds to the nearest half: 5.1 is rounded to 5, and 3.5 is rounded to 4. * Also used in combination with `quantityPerUnit`. Rounds the number of units after `quantityPerUnit` is applied. If you set `quantityPerUnit` to a value other than one, you would typically set Rounding to **UP**. For example, suppose you charge by kilobytes per second (KiBy/s), set `quantityPerUnit` = 500, and set charge rate at $0.25 per unit used. If your customer used 48,900 KiBy/s in a billing period, the charge would be 48,900 / 500 = 97.8 rounded up to 98 * 0.25 = $2.45. Enum: ???UP??? ???DOWN??? ???NEAREST??? ???NONE??? ' $ref: '#/components/schemas/Rounding' quantityPerUnit: type: number description: 'Defines how much of a quantity equates to 1 unit. Used when setting the price per unit for billing purposes - if charging for kilobytes per second (KiBy/s) at rate of $0.25 per 500 KiBy/s, then set quantityPerUnit to 500 and price Plan at $0.25 per unit. If `quantityPerUnit` is set to a value other than one, rounding is typically set to UP.' unit: type: string description: "User defined or following the *Unified Code for Units of Measure* (UCUM). \n\nUsed as the label for billing, indicating to your customers what they are being charged for." code: type: string description: Code of the Aggregation. A unique short code to identify the Aggregation. segments: type: array description: '*(Optional)*. Used when creating a segmented Aggregation, which segments the usage data collected by a single Meter. Works together with `segmentedFields`. Contains the values that are to be used as the segments, read from the fields in the meter pointed at by `segmentedFields`. ' items: type: object additionalProperties: type: string accountingProductId: type: string description: Optional Product ID this Aggregation should be attributed to for accounting purposes. AggregationRequest: type: object description: '' allOf: - $ref: '#/components/schemas/AbstractAggregationRequest' - $ref: '#/components/schemas/AbstractRequestWithCustomFields' - $ref: '#/components/schemas/AbstractRequest' - required: - aggregation - meterId - targetField properties: version: type: integer description: '' format: int64 x-stainless-terraform-configurability: computed x-stainless-terraform-always-send: true meterId: maxLength: 36 minLength: 36 type: string description: 'The UUID of the Meter used as the source of usage data for the Aggregation. Each Aggregation is a child of a Meter, so the Meter must be selected. ' targetField: maxLength: 80 minLength: 1 type: string description: '`Code` of the target `dataField` or `derivedField` on the Meter used as the basis for the Aggregation.' aggregation: description: "Specifies the computation method applied to usage data collected in `targetField`. Aggregation unit value depends on the **Category** configured for the selected `targetField`.\n\nEnum: \n\n* **SUM**. Adds the values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **MIN**. Uses the minimum value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **MAX**. Uses the maximum value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **COUNT**. Counts the number of values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **LATEST**. Uses the most recent value. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`. Note: Based on the timestamp (`ts`) value of usage data measurement submissions. If using this method, please ensure *distinct* `ts` values are used for usage data measurment submissions.\n\n* **MEAN**. Uses the arithmetic mean of the values. Can be applied to a **Measure**, **Income**, or **Cost** `targetField`.\n\n* **UNIQUE**. Uses unique values and returns a count of the number of unique values. Can be applied to a **Metadata** `targetField`.\n\n* **CUSTOM_SQL**. Uses an SQL query expression. If you select this Aggregation type, use the `customSQL` request parameter to enter an SQL query." $ref: '#/components/schemas/Aggregation' segmentedFields: maxItems: 5 type: array description: '*(Optional)*. Used when creating a segmented Aggregation, which segments the usage data collected by a single Meter. Works together with `segments`. Enter the `Codes` of the fields in the target Meter to use for segmentation purposes. String `dataFields` on the target Meter can be segmented. Any string `derivedFields` on the target Meter, such as one that concatenates two string `dataFields`, can also be segmented.' items: type: string segments: maxItems: 1000 type: array description: '*(Optional)*. Used when creating a segmented Aggregation, which segments the usage data collected by a single Meter. Works together with `segmentedFields`. Enter the values that are to be used as the segments, read from the fields in the meter pointed at by `segmentedFields`. Note that you can use *wildcards* or *defaults* when setting up segment values. For more details on how to do this with an example, see [Using Wildcards - API Calls](https://www.m3ter.com/docs/guides/setting-up-usage-data-meters-and-aggregations/segmented-aggregations#using-wildcards---api-calls) in our main User Docs.' items: type: object additionalProperties: type: string defaultValue: minimum: 0 type: number description: 'Aggregation value used when no usage data is available to be aggregated. *(Optional)*. **Note:** Set to 0, if you expect to reference the Aggregation in a Compound Aggregation. This ensures that any null values are passed in correctly to the Compound Aggregation calculation with a value = 0.' customSql: maxLength: 2048 type: string description: 'Enter the SQL query expression to be used for a Custom SQL Aggregation. Custom SQL queries should be run against the Measurements table - for more details see [Custom SQL Aggregations](https://www.m3ter.com/docs/guides/usage-data-aggregations/custom-sql-aggregations) in your main User documentation. **NOTE:** The `customSql` Aggregation type is currently available in Preview release. If you are interested in using this feature, please get in touch with m3ter Support or your m3ter contact.' Rounding: type: string description: 'Specifies how you want to deal with non-integer, fractional number Aggregation values. **NOTES:** * "NEAREST" rounds to the nearest half: 5.1 is rounded to 5, and 3.5 is rounded to 4. * Also used in combination with `quantityPerUnit`. Rounds the number of units after `quantityPerUnit` is applied. If you set `quantityPerUnit` to a value other than one, you would typically set Rounding to **UP**. For example, suppose you charge by kilobytes per second (KiBy/s), set `quantityPerUnit` = 500, and set charge rate at $0.25 per unit used. If your customer used 48,900 KiBy/s in a billing period, the charge would be 48,900 / 500 = 97.8 rounded up to 98 * 0.25 = $2.45. ' enum: - UP - DOWN - NEAREST - NONE AbstractResponseWithCustomFields: type: object description: '' allOf: - $ref: '#/components/schemas/AbstractResponse' - properties: customFields: type: object description: 'User defined fields enabling you to attach custom data. The value for a custom field can be either a string or a number. If `customFields` can also be defined for this entity at the Organizational level,`customField` values defined at individual level override values of `customFields` with the same name defined at Organization level. See [Working with Custom Fields](https://www.m3ter.com/docs/guides/creating-and-managing-products/working-with-custom-fields) in the m3ter documentation for more information.' additionalProperties: anyOf: - title: StringCustomFieldRes type: string - title: IntegerCustomFieldRes type: integer - title: NumberCustomFieldRes type: number responses: Error: description: Error message content: application/json: schema: type: object properties: message: type: string securitySchemes: OAuth2: type: oauth2 description: "m3ter supports machine to machine authentication using the `clientCredentials` OAuth2 flow.\n\nThe `authorizationCode` flow controls access for human users via the m3ter Console application. \n" flows: clientCredentials: tokenUrl: /oauth/token scopes: m3ter-resources/m3ter-scope: m3ter resources measurements:upload: Upload measurements measurements:fileUpload: Upload file measurements:retrieve: Retrieve measurements authorizationCode: authorizationUrl: https://m3ter.auth.us-east-1.amazoncognito.com/oauth2/authorize tokenUrl: https://m3ter.auth.us-east-1.amazoncognito.com/oauth2/token scopes: m3ter-resources/m3ter-scope: m3ter resources openid: OpenID email: email measurements:upload: Upload measurements measurements:fileUpload: Upload file measurements:retrieve: Retrieve measurements