curl --request POST \
--url https://api-sandbox.beinfi.com/metering/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"meter": "<string>",
"productId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customerId": "<string>",
"value": "<string>",
"eventId": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"metadata": {}
}
'import requests
url = "https://api-sandbox.beinfi.com/metering/events"
payload = {
"meter": "<string>",
"productId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customerId": "<string>",
"value": "<string>",
"eventId": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
meter: '<string>',
productId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
customerId: '<string>',
value: '<string>',
eventId: '<string>',
timestamp: '2023-11-07T05:31:56Z',
metadata: {}
})
};
fetch('https://api-sandbox.beinfi.com/metering/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.beinfi.com/metering/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'meter' => '<string>',
'productId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'customerId' => '<string>',
'value' => '<string>',
'eventId' => '<string>',
'timestamp' => '2023-11-07T05:31:56Z',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.beinfi.com/metering/events"
payload := strings.NewReader("{\n \"meter\": \"<string>\",\n \"productId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"customerId\": \"<string>\",\n \"value\": \"<string>\",\n \"eventId\": \"<string>\",\n \"timestamp\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-sandbox.beinfi.com/metering/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"meter\": \"<string>\",\n \"productId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"customerId\": \"<string>\",\n \"value\": \"<string>\",\n \"eventId\": \"<string>\",\n \"timestamp\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.beinfi.com/metering/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"meter\": \"<string>\",\n \"productId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"customerId\": \"<string>\",\n \"value\": \"<string>\",\n \"eventId\": \"<string>\",\n \"timestamp\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>",
"errors": [
{
"field": "<string>",
"value": "<string>",
"constraint": "<string>",
"description": "<string>"
}
]
}Record a usage event
Records one usage event for a customer on a meter. customerId accepts the enrollment ID or the customer’s externalId. Without value, the event counts as 1.
So that a resend is not billed twice, send the same eventId and the same timestamp as the original event. Without timestamp, each call is stamped with its arrival time and recorded as a new event.
If the customer’s balance is exhausted and the product blocks consumption, the response is 403 with error_code consumption_blocked and the usage is not recorded.
curl --request POST \
--url https://api-sandbox.beinfi.com/metering/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"meter": "<string>",
"productId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customerId": "<string>",
"value": "<string>",
"eventId": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"metadata": {}
}
'import requests
url = "https://api-sandbox.beinfi.com/metering/events"
payload = {
"meter": "<string>",
"productId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customerId": "<string>",
"value": "<string>",
"eventId": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
meter: '<string>',
productId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
customerId: '<string>',
value: '<string>',
eventId: '<string>',
timestamp: '2023-11-07T05:31:56Z',
metadata: {}
})
};
fetch('https://api-sandbox.beinfi.com/metering/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.beinfi.com/metering/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'meter' => '<string>',
'productId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'customerId' => '<string>',
'value' => '<string>',
'eventId' => '<string>',
'timestamp' => '2023-11-07T05:31:56Z',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.beinfi.com/metering/events"
payload := strings.NewReader("{\n \"meter\": \"<string>\",\n \"productId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"customerId\": \"<string>\",\n \"value\": \"<string>\",\n \"eventId\": \"<string>\",\n \"timestamp\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-sandbox.beinfi.com/metering/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"meter\": \"<string>\",\n \"productId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"customerId\": \"<string>\",\n \"value\": \"<string>\",\n \"eventId\": \"<string>\",\n \"timestamp\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.beinfi.com/metering/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"meter\": \"<string>\",\n \"productId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"customerId\": \"<string>\",\n \"value\": \"<string>\",\n \"eventId\": \"<string>\",\n \"timestamp\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>",
"errors": [
{
"field": "<string>",
"value": "<string>",
"constraint": "<string>",
"description": "<string>"
}
]
}Authorizations
Your account's secret key: Authorization: Bearer sk_test_… or sk_live_…. Server-side only.
Headers
A unique key per operation (a UUID works). Retrying with the same key returns the original response.
Body
Meter key (for example tokens).
The meter's product.
The enrollment ID or the customer's externalId. The enrollment must belong to the given product.
Quantity, as a decimal string. Defaults to 1.
Your id for this event. Together with the same timestamp, a resend with the same eventId is not counted again.
When the usage happened. Without it, the arrival time is used, and a resend becomes a new event.
Your own free-form JSON data.
Response
Event accepted. duplicate: true means it was already recorded and was not counted again.
Result of recording usage. accepted means the event was recorded now; duplicate, that it had already been recorded.