curl --request GET \
--url https://openapi.enginy.ai/v1/credits/transactions \
--header 'x-api-key: <api-key>'import requests
url = "https://openapi.enginy.ai/v1/credits/transactions"
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/transactions', 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/transactions",
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/transactions"
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/transactions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/credits/transactions")
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",
"limit": 123,
"offset": 123,
"total": 123,
"transactions": [
{
"id": 123,
"createdAt": "2023-11-07T05:31:56Z",
"amount": 123,
"type": "<string>",
"user": {
"id": 123,
"name": "<string>",
"email": "<string>"
},
"workflowStatus": "<string>",
"entity": {
"kind": "contact",
"id": 123,
"name": "<string>",
"companyName": "<string>"
},
"groupKey": "<string>",
"kind": "process",
"process": {
"id": 123,
"workflowType": "<string>",
"listName": "<string>"
},
"run": {
"id": "<string>",
"advancedWorkflowId": 123,
"name": "<string>"
},
"campaign": {
"id": 123,
"name": "<string>"
}
}
]
}
}Get credit transactions
The credit transaction log: every ledger transaction in a date window, or of one statement line (groupKey), newest first, with its signed amount, credit type, timestamp, the user who triggered it, the contact or company it was for and the statement context it belongs to (activity, advanced-workflow run, campaign, top-up). Same filters as GET /v1/credits/statement, with costMin and costMax bounding each transaction’s absolute amount; page with limit and offset. 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/transactions \
--header 'x-api-key: <api-key>'import requests
url = "https://openapi.enginy.ai/v1/credits/transactions"
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/transactions', 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/transactions",
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/transactions"
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/transactions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/credits/transactions")
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",
"limit": 123,
"offset": 123,
"total": 123,
"transactions": [
{
"id": 123,
"createdAt": "2023-11-07T05:31:56Z",
"amount": 123,
"type": "<string>",
"user": {
"id": 123,
"name": "<string>",
"email": "<string>"
},
"workflowStatus": "<string>",
"entity": {
"kind": "contact",
"id": 123,
"name": "<string>",
"companyName": "<string>"
},
"groupKey": "<string>",
"kind": "process",
"process": {
"id": 123,
"workflowType": "<string>",
"listName": "<string>"
},
"run": {
"id": "<string>",
"advancedWorkflowId": 123,
"name": "<string>"
},
"campaign": {
"id": 123,
"name": "<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
Only the transactions of one statement line, by the groupKey GET /v1/credits/statement returned (process:<id>, run:<id>, campaign:<id>, topup:<transactionId>, single:<transactionId>). Omit for every transaction in the window.
1"process:4821"