curl --request GET \
--url https://openapi.enginy.ai/v1/credits/statement \
--header 'x-api-key: <api-key>'import requests
url = "https://openapi.enginy.ai/v1/credits/statement"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://openapi.enginy.ai/v1/credits/statement', 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://openapi.enginy.ai/v1/credits/statement",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://openapi.enginy.ai/v1/credits/statement"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://openapi.enginy.ai/v1/credits/statement")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/credits/statement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"fromDate": "2023-11-07T05:31:56Z",
"toDate": "2023-11-07T05:31:56Z",
"effectiveFromDate": "2023-11-07T05:31:56Z",
"limit": 123,
"offset": 123,
"totalLines": 123,
"lines": [
{
"groupKey": "<string>",
"kind": "process",
"process": {
"id": 123,
"workflowType": "<string>",
"listName": "<string>"
},
"run": {
"id": "<string>",
"advancedWorkflowId": 123,
"name": "<string>"
},
"campaign": {
"id": 123,
"name": "<string>"
},
"types": [
"<string>"
],
"totalAmount": 123,
"transactionCount": 123,
"firstAt": "2023-11-07T05:31:56Z",
"lastAt": "2023-11-07T05:31:56Z",
"user": {
"id": 123,
"name": "<string>",
"email": "<string>"
}
}
]
}
}Get credit statement
The Credits page statement: one line per spend context inside a date window — an enrichment or import activity (process), an advanced-workflow run (run), the AI messages of a campaign (campaign), a top-up or plan movement (topup) or a charge with no linkable context (single) — with its signed credit total, transaction count, charged credit types and the user it is attributed to, newest first. Filter by window, triggering users, credit types and the absolute line total; page with limit and offset. Pass a line’s groupKey to GET /v1/credits/transactions to list its transactions. Spend is negative and top-ups positive, so the lines of a full window sum to the balance movement of GET /v1/credits over it. effectiveFromDate says when a high-volume window was narrowed. Workspace admins only: with an API key, the key creator must be a workspace admin; over MCP, the connected user. Available to workspaces the feature is enabled for.
Required scope:
WORKSPACE_READRate limit: 100 requests per minute
curl --request GET \
--url https://openapi.enginy.ai/v1/credits/statement \
--header 'x-api-key: <api-key>'import requests
url = "https://openapi.enginy.ai/v1/credits/statement"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://openapi.enginy.ai/v1/credits/statement', 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://openapi.enginy.ai/v1/credits/statement",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://openapi.enginy.ai/v1/credits/statement"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://openapi.enginy.ai/v1/credits/statement")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/credits/statement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"fromDate": "2023-11-07T05:31:56Z",
"toDate": "2023-11-07T05:31:56Z",
"effectiveFromDate": "2023-11-07T05:31:56Z",
"limit": 123,
"offset": 123,
"totalLines": 123,
"lines": [
{
"groupKey": "<string>",
"kind": "process",
"process": {
"id": 123,
"workflowType": "<string>",
"listName": "<string>"
},
"run": {
"id": "<string>",
"advancedWorkflowId": 123,
"name": "<string>"
},
"campaign": {
"id": 123,
"name": "<string>"
},
"types": [
"<string>"
],
"totalAmount": 123,
"transactionCount": 123,
"firstAt": "2023-11-07T05:31:56Z",
"lastAt": "2023-11-07T05:31:56Z",
"user": {
"id": 123,
"name": "<string>",
"email": "<string>"
}
}
]
}
}Authorizations
Query Parameters
Inclusive start of the window, ISO 8601. Defaults to 30 days before toDate. The window may span at most 366 days.
"2026-10-01T00:00:00Z"
Inclusive end of the window, ISO 8601. Defaults to now.
"2026-10-31T23:59:59Z"
Rows per page, 1 to 100. Defaults to 50.
Rows to skip, for pagination. Defaults to 0. offset + limit may not exceed 10000: narrow the window with fromDate and toDate to read further back. Later pages must pass the fromDate and toDate the first response echoed, or spend recorded in between shifts every page.
Credit types to keep, as the Credits page labels them: ledger types such as ENRICH_LEAD_EMAIL, VERIFY_EMAIL, SCRAPE_LEAD_LINKEDIN or TOPUP_PLAN (see GET /v1/credits/pricing for the spend actions), and the AI splits AI_MESSAGE, AI_ENRICHMENT, AI_VARIABLE_CAMPAIGN, AI_CHAT and AI_COMPLETION. Comma-separated or repeated; through MCP, an array.
601["ENRICH_LEAD_EMAIL", "AI_ENRICHMENT"]
Only charges triggered by these Enginy user ids (the user.id of a line). Comma-separated or repeated; through MCP, an array.
200[12, 34]
Lower bound on the absolute credit amount, inclusive.
x >= 010
Upper bound on the absolute credit amount, inclusive.
x >= 05000