API documentation for Apple + Google NFC wallet credentials - AccessGrid

API Documentation

Everything you need to interact with AccessGrid.

Programming Languages

Read Event Log

Enterprise only

Copy for LLMCopied

Only available for enterprise customers - allows you to read full event log for a given card template, including which passes were issued, how and by whom using our console API.

card_template_id

nullable string

Unique identifier for the card template to look up

filters

nullable object

Filters to reduce result size of event logs

device

nullable string

Must be either mobile or watch

start_date

nullable datetime

Must be in ISO8601 format

end_date

nullable datetime

Must be in ISO8601 format

event_type

nullable string

Must be either issue, install, update, suspend, resume, or unlink

Request

# Build the JSON payload
TEMPLATE_ID="0xd3adb00b5"
PAYLOAD="{\"id\":\"$TEMPLATE_ID\"}"

# Sign the payload
PAYLOAD_B64=$(printf '%s' "$PAYLOAD" | openssl base64 -A)
SIG=$(printf '%s' "$PAYLOAD_B64" | openssl dgst -sha256 -hmac "$SECRET_KEY" -hex | awk '{print $NF}')

curl -v -G \
-H "X-ACCT-ID: $ACCOUNT_ID" \
-H "X-PAYLOAD-SIG: $SIG" \
--data-urlencode "sig_payload=$PAYLOAD" \
"https://api.accessgrid.com/v1/console/card-templates/$TEMPLATE_ID/logs"
require 'accessgrid'

acct_id = ENV['ACCOUNT_ID']
secret_key = ENV['SECRET_KEY']

client = AccessGrid.new(acct_id, secret_key)

events = client.console.event_log(
card_template_id: "0xd3adb00b5",
filters: {
device: "mobile",
start_date: 30.days.ago.utc.iso8601(3),
end_date: Time.zone.now.utc.iso8601(3),
event_type: "install"
}
)

events.each do |event|
puts "Event: #{event.type} at #{event.timestamp} by #{event.user_id}"
done
import AccessGrid from 'accessgrid';

const accountId = process.env.ACCOUNT_ID;
const secretKey = process.env.SECRET_KEY;

const client = new AccessGrid(accountId, secretKey);

const getEventLog = async () => {
try {
const events = await client.console.eventLog({
     cardTemplateId: "0xd3adb00b5",
     filters: {
       device: "mobile",
       startDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),
       endDate: new Date().toISOString(),
       eventType: "install"
     }
});

events.forEach(event => {
     console.log(`Event: ${event.type} at ${event.timestamp} by ${event.userId}`);
});
} catch (error) {
console.error('Error fetching event log:', error);
}
};

getEventLog();
from accessgrid import AccessGrid
import os
from datetime import datetime, timezone, timedelta

account_id = os.getenv('ACCOUNT_ID')
secret_key = os.getenv('SECRET_KEY')

client = AccessGrid(account_id, secret_key)

start_date = (datetime.now(timezone.utc) - timedelta(days=30)).isoformat()
end_date = datetime.now(timezone.utc).isoformat()

events = client.console.event_log(
card_template_id="0xd3adb00b5",
filters={
       "device": "mobile",
       "start_date": start_date,
       "end_date": end_date,
       "event_type": "install"
}
)

for event in events:
print(f"Event: {event.type} at {event.timestamp} by {event.user_id}")
package main

import (
    "context"
    "fmt"
    "os"
    "time"
    "github.com/Access-Grid/accessgrid-go"
)

func main() {
    accountID := os.Getenv("ACCOUNT_ID")
    secretKey := os.Getenv("SECRET_KEY")

client, err := accessgrid.NewClient(accountID, secretKey)
    if err != nil {
        fmt.Printf("Error creating client: %v\n", err)
        return
    }

startDate := time.Now().AddDate(0, 0, -30).UTC()
    endDate := time.Now().UTC()
    filters := accessgrid.EventLogFilters{
        Device:    "mobile",
        StartDate: &startDate,
        EndDate:   &endDate,
        EventType: "install",
    }

ctx := context.Background()
    events, err := client.Console.EventLog(ctx, "0xd3adb00b5", filters)
    if err != nil {
        fmt.Printf("Error fetching event log: %v\n", err)
        return
    }

for _, event := range events {
        fmt.Printf("Event: %s at %s by %s\n", event.Type, event.Timestamp, event.UserID)
    }
}
using AccessGrid;
using System;

public async Task GetEventLogAsync()
{
var accountId = Environment.GetEnvironmentVariable("ACCOUNT_ID");
var secretKey = Environment.GetEnvironmentVariable("SECRET_KEY");

var client = new AccessGridClient(accountId, secretKey);

var events = await client.Console.EventLogAsync(
       "0xd3adb00b5",
       new EventLogFilters
       {
           Device = "mobile",
           StartDate = DateTime.UtcNow.AddDays(-30),
           EndDate = DateTime.UtcNow,
           EventType = "install"
       });

foreach (var evt in events)
{
       Console.WriteLine($"Event: {evt.Type} at {evt.Timestamp} by {evt.UserId}");
}
}
import com.organization.accessgrid.AccessGridClient;
import com.organization.accessgrid.model.Event;
import com.organization.accessgrid.model.EventLogFilters;
import java.time.ZonedDateTime;
import java.util.List;

public class ConsoleService {
private final AccessGridClient client;

public ConsoleService() {
       String accountId = System.getenv("ACCOUNT_ID");
       String secretKey = System.getenv("SECRET_KEY");
       this.client = new AccessGridClient(accountId, secretKey);
}

public void getEventLog() throws AccessGridException {
       EventLogFilters filters = EventLogFilters.builder()
           .device("mobile")
           .startDate(ZonedDateTime.now().minusDays(30))
           .endDate(ZonedDateTime.now())
           .eventType("install")
           .build();

List<Event> events = client.console().eventLog("0xd3adb00b5", filters);

for (Event event : events) {
           System.out.printf("Event: %s at %s by %s\n",
               event.getType(),
               event.getTimestamp(),
               event.getUserId());
       }
}
}
<?php

require 'vendor/autoload.php';

use AccessGridClient;

$accountId = $_ENV['ACCOUNT_ID'];
$secretKey = $_ENV['SECRET_KEY'];

$client = new Client($accountId, $secretKey);

$events = $client->console->eventLog([
'card_template_id' => '0xd3adb00b5',
'filters' => [
       'device' => 'mobile',
       'start_date' => (new DateTime('30 days ago'))->format('c'),
       'end_date' => (new DateTime('now'))->format('c'),
       'event_type' => 'install'
]
]);

foreach ($events as $event) {
echo "Event: {$event->type} at {$event->timestamp} by {$event->user_id}\n";
}
?>
{:ok, client} = AccessGrid.new(
System.get_env("ACCOUNT_ID"),
System.get_env("SECRET_KEY")
)

{:ok, events} = AccessGrid.Console.event_log(client,
card_template_id: "0xd3adb00b5",
filters: %{
    device: "mobile",
    start_date: DateTime.utc_now() |> DateTime.add(-30, :day) |> DateTime.to_iso8601(),
    end_date: DateTime.utc_now() |> DateTime.to_iso8601(),
    event_type: "install"
}
)

Enum.each(events, fn event ->
IO.puts("Event: #{event.type} at #{event.timestamp} by #{event.user_id}")
done
)

Response

{
"logs": [
    {
      "id": "evt_91f2a7c3",
      "event": "install",
      "created_at": "2025-11-30T10:14:22Z",
      "ip_address": "192.168.1.24",
      "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X)",
      "metadata": {
        "device": "mobile",
        "platform": "apple",
        "card_id": "key_a91c7e23",
        "template_id": "0xd3adb00b5"
      }
    },
    {
      "id": "evt_c83d19aa",
      "event": "install",
      "created_at": "2025-12-05T16:48:09Z",
      "ip_address": "10.0.0.88",
      "user_agent": "Mozilla/5.0 (Linux; Android 14; Pixel 8)",
      "metadata": {
        "device": "mobile",
        "platform": "android",
        "card_id": "key_b81d77ef",
        "template_id": "0xd3adb00b5"
      }
    }
],
"pagination": {
    "current_page": 1,
    "per_page": 20,
    "total_pages": 1,
    "total_count": 2
}
}