curl --request GET \
--url https://api.fanfeed.ai/v1/users/{user_id}/events \
--header 'X-PARTNER-API-KEY: <api-key>'import requests
url = "https://api.fanfeed.ai/v1/users/{user_id}/events"
headers = {"X-PARTNER-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-PARTNER-API-KEY': '<api-key>'}};
fetch('https://api.fanfeed.ai/v1/users/{user_id}/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.fanfeed.ai/v1/users/{user_id}/events",
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-PARTNER-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://api.fanfeed.ai/v1/users/{user_id}/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-PARTNER-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://api.fanfeed.ai/v1/users/{user_id}/events")
.header("X-PARTNER-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fanfeed.ai/v1/users/{user_id}/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-PARTNER-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"events": [
{
"id": 18012359,
"name": "Zach Bryan",
"starts_at_local": "2026-06-13T19:30:00",
"venue": {
"id": 4412,
"name": "Madison Square Garden",
"city": "New York",
"region": "NY",
"country": "US",
"latitude": "<unknown>",
"longitude": "<unknown>"
},
"performers": [
{
"id": 34421,
"name": "Zach Bryan",
"category": "Country",
"image_url": "<string>",
"is_headliner": true
}
],
"media_count": 12,
"media": [
{
"media_id": "B84E8479-475C-4727-A4A4-B77AA9980897/L0/001",
"taken_at": "2023-11-07T05:31:56Z",
"media_type": "photo",
"thumbnail_url": "<string>"
}
]
}
],
"has_more": false,
"next_cursor": "<string>",
"total": 47
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}List a user's matched events
The user’s attended-event history, newest first, with the matched media attached to each event.
This is everything an events tab and an event detail screen need. The media for an event is included here, so opening an event costs no extra request.
Hidden events, and events not licensed for redistribution, are filtered out and never appear.
curl --request GET \
--url https://api.fanfeed.ai/v1/users/{user_id}/events \
--header 'X-PARTNER-API-KEY: <api-key>'import requests
url = "https://api.fanfeed.ai/v1/users/{user_id}/events"
headers = {"X-PARTNER-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-PARTNER-API-KEY': '<api-key>'}};
fetch('https://api.fanfeed.ai/v1/users/{user_id}/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.fanfeed.ai/v1/users/{user_id}/events",
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-PARTNER-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://api.fanfeed.ai/v1/users/{user_id}/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-PARTNER-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://api.fanfeed.ai/v1/users/{user_id}/events")
.header("X-PARTNER-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fanfeed.ai/v1/users/{user_id}/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-PARTNER-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"events": [
{
"id": 18012359,
"name": "Zach Bryan",
"starts_at_local": "2026-06-13T19:30:00",
"venue": {
"id": 4412,
"name": "Madison Square Garden",
"city": "New York",
"region": "NY",
"country": "US",
"latitude": "<unknown>",
"longitude": "<unknown>"
},
"performers": [
{
"id": 34421,
"name": "Zach Bryan",
"category": "Country",
"image_url": "<string>",
"is_headliner": true
}
],
"media_count": 12,
"media": [
{
"media_id": "B84E8479-475C-4727-A4A4-B77AA9980897/L0/001",
"taken_at": "2023-11-07T05:31:56Z",
"media_type": "photo",
"thumbnail_url": "<string>"
}
]
}
],
"has_more": false,
"next_cursor": "<string>",
"total": 47
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}{
"error": {
"code": "invalid_batch_size",
"message": "Send at most 200 media items per request.",
"details": {}
}
}Authorizations
Your FanFeed partner API key, issued to your organization.
FanFeed trusts your authentication: the key identifies you, and the user_id in the
path identifies which of your users the request is for. FanFeed performs no end-user
authentication of its own.
Treat the key as a server-side secret. See the guide for what that implies for the camera-roll ingest path, which is the one call that naturally originates on-device.
Path Parameters
The FanFeed user id returned by POST /users.
"8f14e45f-ceea-467a-9a1e-2b4d9c3f0a11"
Query Parameters
Events per page.
1 <= x <= 100Opaque cursor from next_cursor on the previous page.
Set false for a lighter payload when you only need the event list.
Response
A page of matched events.
Show child attributes
Show child attributes
false
Pass as cursor for the next page. null on the last page.
Total matched events for this user. May be omitted on later pages; page with
has_more and next_cursor, not with total.
47