Capture department and project as billing dimensionsv3.14+
This example enriches usage events with department and project dimensions pulled from request headers.
These attributes are included in the event data payload and can be used to apply tiered pricing rules, enforce per-department usage budgets, or produce internal chargeback reports.
For example, a request with x-department: engineering and x-project: search produces an event containing "department": "engineering" and "project": "search" in its data.
If a header is absent on a given request, that attribute is omitted from that event.
To aggregate usage and generate invoices, you need either Konnect Metering & Billing or a self-hosted OpenMeter instance.
Prerequisites
-
Your API clients must pass
x-departmentandx-projectheaders on requests you want to track by dimension. -
An authentication plugin (for example, Key Auth or JWT) is configured on the same Gateway Service or Route so that a Consumer is present on each request.
-
A Konnect system account token (
spat_) or OpenMeter API key to use as theauth_token.
Environment variables
-
AUTH_TOKEN: A Konnect system account token (spat_) or OpenMeter API key.
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: metering-and-billing
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: ${{ env "DECK_AUTH_TOKEN" }}
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
Make the following request:
curl -i -X POST http://localhost:8001/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
name: metering-and-billing
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
labels:
global: 'true'
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: '$AUTH_TOKEN'
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
plugin: metering-and-billing
" | kubectl apply -f -
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_metering_and_billing" "my_metering_and_billing" {
enabled = true
config = {
ingest_endpoint = "https://us.api.konghq.com/v3/openmeter/events"
api_token = var.auth_token
meter_api_requests = true
meter_ai_token_usage = false
subject = {
look_up_value_in = "consumer"
}
attributes = [
{
source = "header"
look_up_value_in = "x-department"
event_property_name = "department"
},
{
source = "header"
look_up_value_in = "x-project"
event_property_name = "project"
} ]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "auth_token" {
type = string
}
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: metering-and-billing
service: serviceName|Id
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: ${{ env "DECK_AUTH_TOKEN" }}
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
Make sure to replace the following placeholders with your own values:
-
serviceName|Id: Theidornameof the service the plugin configuration will target.
Make the following request:
curl -i -X POST http://localhost:8001/services/{serviceName|Id}/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
serviceName|Id: Theidornameof the service the plugin configuration will target.
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/services/{serviceId}/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane. -
serviceId: Theidof the service the plugin configuration will target.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: metering-and-billing
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: '$AUTH_TOKEN'
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
plugin: metering-and-billing
" | kubectl apply -f -
Next, apply the KongPlugin resource by annotating the service resource:
kubectl annotate -n kong service SERVICE_NAME konghq.com/plugins=metering-and-billing
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_metering_and_billing" "my_metering_and_billing" {
enabled = true
config = {
ingest_endpoint = "https://us.api.konghq.com/v3/openmeter/events"
api_token = var.auth_token
meter_api_requests = true
meter_ai_token_usage = false
subject = {
look_up_value_in = "consumer"
}
attributes = [
{
source = "header"
look_up_value_in = "x-department"
event_property_name = "department"
},
{
source = "header"
look_up_value_in = "x-project"
event_property_name = "project"
} ]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
service = {
id = konnect_gateway_service.my_service.id
}
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "auth_token" {
type = string
}
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: metering-and-billing
route: routeName|Id
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: ${{ env "DECK_AUTH_TOKEN" }}
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
Make sure to replace the following placeholders with your own values:
-
routeName|Id: Theidornameof the route the plugin configuration will target.
Make the following request:
curl -i -X POST http://localhost:8001/routes/{routeName|Id}/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
routeName|Id: Theidornameof the route the plugin configuration will target.
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/routes/{routeId}/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane. -
routeId: Theidof the route the plugin configuration will target.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: metering-and-billing
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: '$AUTH_TOKEN'
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
plugin: metering-and-billing
" | kubectl apply -f -
Next, apply the KongPlugin resource by annotating the httproute or ingress resource:
kubectl annotate -n kong httproute konghq.com/plugins=metering-and-billing
kubectl annotate -n kong ingress konghq.com/plugins=metering-and-billing
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_metering_and_billing" "my_metering_and_billing" {
enabled = true
config = {
ingest_endpoint = "https://us.api.konghq.com/v3/openmeter/events"
api_token = var.auth_token
meter_api_requests = true
meter_ai_token_usage = false
subject = {
look_up_value_in = "consumer"
}
attributes = [
{
source = "header"
look_up_value_in = "x-department"
event_property_name = "department"
},
{
source = "header"
look_up_value_in = "x-project"
event_property_name = "project"
} ]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
route = {
id = konnect_gateway_route.my_route.id
}
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "auth_token" {
type = string
}
Add this section to your kong.yaml configuration file:
_format_version: "3.0"
plugins:
- name: metering-and-billing
consumer: consumerName|Id
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: ${{ env "DECK_AUTH_TOKEN" }}
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
Make sure to replace the following placeholders with your own values:
-
consumerName|Id: Theidornameof the consumer the plugin configuration will target.
Make the following request:
curl -i -X POST http://localhost:8001/consumers/{consumerName|Id}/plugins/ \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
consumerName|Id: Theidornameof the consumer the plugin configuration will target.
Make the following request:
curl -X POST https://{region}.api.konghq.com/v2/control-planes/{controlPlaneId}/core-entities/consumers/{consumerId}/plugins/ \
--header "accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $KONNECT_TOKEN" \
--data '
{
"name": "metering-and-billing",
"config": {
"ingest_endpoint": "https://us.api.konghq.com/v3/openmeter/events",
"api_token": "'$AUTH_TOKEN'",
"meter_api_requests": true,
"meter_ai_token_usage": false,
"subject": {
"look_up_value_in": "consumer"
},
"attributes": [
{
"source": "header",
"look_up_value_in": "x-department",
"event_property_name": "department"
},
{
"source": "header",
"look_up_value_in": "x-project",
"event_property_name": "project"
}
]
},
"tags": []
}
'
Make sure to replace the following placeholders with your own values:
-
region: Geographic region where your Kong Konnect is hosted and operates. -
KONNECT_TOKEN: Your Personal Access Token (PAT) associated with your Konnect account. -
controlPlaneId: Theidof the control plane. -
consumerId: Theidof the consumer the plugin configuration will target.
See the Konnect API reference to learn about region-specific URLs and personal access tokens.
echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: metering-and-billing
namespace: kong
annotations:
kubernetes.io/ingress.class: kong
konghq.com/tags: ''
config:
ingest_endpoint: https://us.api.konghq.com/v3/openmeter/events
api_token: '$AUTH_TOKEN'
meter_api_requests: true
meter_ai_token_usage: false
subject:
look_up_value_in: consumer
attributes:
- source: header
look_up_value_in: x-department
event_property_name: department
- source: header
look_up_value_in: x-project
event_property_name: project
plugin: metering-and-billing
" | kubectl apply -f -
Next, apply the KongPlugin resource by annotating the KongConsumer resource:
kubectl annotate -n kong kongconsumer CONSUMER_NAME konghq.com/plugins=metering-and-billing
Prerequisite: Configure your Personal Access Token
terraform {
required_providers {
konnect = {
source = "kong/konnect"
}
}
}
provider "konnect" {
personal_access_token = "$KONNECT_TOKEN"
server_url = "https://us.api.konghq.com/"
}
Add the following to your Terraform configuration to create a Konnect Gateway Plugin:
resource "konnect_gateway_plugin_metering_and_billing" "my_metering_and_billing" {
enabled = true
config = {
ingest_endpoint = "https://us.api.konghq.com/v3/openmeter/events"
api_token = var.auth_token
meter_api_requests = true
meter_ai_token_usage = false
subject = {
look_up_value_in = "consumer"
}
attributes = [
{
source = "header"
look_up_value_in = "x-department"
event_property_name = "department"
},
{
source = "header"
look_up_value_in = "x-project"
event_property_name = "project"
} ]
}
tags = []
control_plane_id = konnect_gateway_control_plane.my_konnect_cp.id
consumer = {
id = konnect_gateway_consumer.my_consumer.id
}
}
This example requires the following variables to be added to your manifest. You can specify values at runtime by setting TF_VAR_name=value.
variable "auth_token" {
type = string
}