List API Logs
curl --request GET \
--url https://api.linkupapi.com/v2/logs \
--header 'x-api-key: <x-api-key>'import requests
url = "https://api.linkupapi.com/v2/logs"
headers = {"x-api-key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<x-api-key>'}};
fetch('https://api.linkupapi.com/v2/logs', 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.linkupapi.com/v2/logs",
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: <x-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://api.linkupapi.com/v2/logs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<x-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://api.linkupapi.com/v2/logs")
.header("x-api-key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkupapi.com/v2/logs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"items": [
{
"user_id": "6791f88f4db9c32ae63eadad",
"action": "invite",
"account_id": "69c127c37cae0494dd827286",
"credits_consumed": 1,
"status": "success",
"created_at": "2025-01-15T10:29:41.512000"
},
{
"user_id": "6791f88f4db9c32ae63eadad",
"action": "check_inmail_seat",
"account_id": "6aaba8609d428bee16115d50",
"credits_consumed": 0,
"status": "error",
"created_at": "2025-01-15T09:49:18.489000",
"error_message": "Account not found"
}
],
"total": 23729,
"limit": 2,
"offset": 0
},
"metadata": {
"action": "list_logs",
"credits_consumed": 0,
"timestamp": "2025-01-15T10:30:00.000000"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "query -> limit: Input should be less than or equal to 200"
},
"metadata": {
"credits_consumed": 0,
"timestamp": "2025-01-15T10:30:00.000000"
}
}
Logs
List API Logs
Browse your API call history, one entry per request
GET
/
v2
/
logs
List API Logs
curl --request GET \
--url https://api.linkupapi.com/v2/logs \
--header 'x-api-key: <x-api-key>'import requests
url = "https://api.linkupapi.com/v2/logs"
headers = {"x-api-key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<x-api-key>'}};
fetch('https://api.linkupapi.com/v2/logs', 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.linkupapi.com/v2/logs",
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: <x-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://api.linkupapi.com/v2/logs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<x-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://api.linkupapi.com/v2/logs")
.header("x-api-key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linkupapi.com/v2/logs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"items": [
{
"user_id": "6791f88f4db9c32ae63eadad",
"action": "invite",
"account_id": "69c127c37cae0494dd827286",
"credits_consumed": 1,
"status": "success",
"created_at": "2025-01-15T10:29:41.512000"
},
{
"user_id": "6791f88f4db9c32ae63eadad",
"action": "check_inmail_seat",
"account_id": "6aaba8609d428bee16115d50",
"credits_consumed": 0,
"status": "error",
"created_at": "2025-01-15T09:49:18.489000",
"error_message": "Account not found"
}
],
"total": 23729,
"limit": 2,
"offset": 0
},
"metadata": {
"action": "list_logs",
"credits_consumed": 0,
"timestamp": "2025-01-15T10:30:00.000000"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "query -> limit: Input should be less than or equal to 200"
},
"metadata": {
"credits_consumed": 0,
"timestamp": "2025-01-15T10:30:00.000000"
}
}
Every V2 call is logged: action, LinkedIn account used, credits consumed, status and error message. Logs are tied to your user, so they survive an API key rotation. Served from our store: no LinkedIn traffic and no credits consumed.
Paginated, newest first, capped at 200 rows per page.
Header Parameters
string
required
Your API key
Query Parameters
integer
default:"50"
Number of rows per page. Between 1 and 200.
integer
default:"0"
Number of rows to skip.
string
Only calls of this action, e.g.
invite, send, search_people. Same names as the metadata.action of each response.string
Only calls made with this LinkedIn account.
string
success or error.string
ISO date (
YYYY-MM-DD) or datetime. Only calls at or after this moment.string
ISO date or datetime. A date-only value is inclusive of that whole day.
Response
boolean
Whether the request was successful
object
Show Properties
Show Properties
array
integer
Total number of rows matching the filters
integer
Page size used
integer
Offset used
{
"success": true,
"data": {
"items": [
{
"user_id": "6791f88f4db9c32ae63eadad",
"action": "invite",
"account_id": "69c127c37cae0494dd827286",
"credits_consumed": 1,
"status": "success",
"created_at": "2025-01-15T10:29:41.512000"
},
{
"user_id": "6791f88f4db9c32ae63eadad",
"action": "check_inmail_seat",
"account_id": "6aaba8609d428bee16115d50",
"credits_consumed": 0,
"status": "error",
"created_at": "2025-01-15T09:49:18.489000",
"error_message": "Account not found"
}
],
"total": 23729,
"limit": 2,
"offset": 0
},
"metadata": {
"action": "list_logs",
"credits_consumed": 0,
"timestamp": "2025-01-15T10:30:00.000000"
}
}
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "query -> limit: Input should be less than or equal to 200"
},
"metadata": {
"credits_consumed": 0,
"timestamp": "2025-01-15T10:30:00.000000"
}
}
Notes
- This endpoint does not consume any credits
- Filters combine:
?account_id=…&action=list_inbox&status=errorreturns only the failed inbox reads of that account GET /v2/logs/statsreturns the same history aggregated:total_calls,total_credits,by_accountandby_action(calls, successes, errors, credits). Acceptsaccount_id,date_from,date_to; withaccount_id,by_actionis the breakdown of that accountGET /v2/logs/exportreturns the same rows as a CSV file, same filters, no pagination
Was this page helpful?