Arktis.

API Reference

Query your analytics data using the Cloud Functions API.

Base URL

https://europe-west1-arktis-ui.cloudfunctions.net

Core Endpoints

POST/ingest

Ingest tracking events from the tracker script. Includes rate limiting (10,000 events/min/site) and bot filtering.

Request Body

{
  "site_id": "uuid",
  "events": [
    {
      "anonymous_id": "string",
      "session_id": "string",
      "event_type": "pageview" | "event" | "identify" | "convert",
      "event_name": "string (optional)",
      "page_url": "string",
      "page_path": "string",
      "page_title": "string",
      "referrer": "string",
      "user_agent": "string",
      "properties": {},
      "utm_source": "string",
      "utm_medium": "string",
      "utm_campaign": "string"
    }
  ]
}

Response

{ "success": true, "processed": 1 }

Rate Limit: 10,000 events per site per minute. Returns 429 if exceeded.

GET/getLiveVisitors

Get active sessions from the last 30 minutes.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID for auth.

Response

{
  "sessions": [
    {
      "id": "uuid",
      "visitorId": "uuid",
      "anonymousId": "string",
      "startedAt": "2024-01-15T10:00:00Z",
      "lastActivityAt": "2024-01-15T10:05:00Z",
      "source": "google",
      "medium": "organic",
      "landingPage": "/",
      "pageCount": 3,
      "deviceType": "desktop",
      "browser": "Chrome",
      "events": [...]
    }
  ]
}
GET/getOverview

Get aggregate statistics for a site.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.
startDatedateOptional. YYYY-MM-DD format.
endDatedateOptional. YYYY-MM-DD format.

Response

{
  "uniqueVisitors": 1250,
  "totalSessions": 3420,
  "pageviews": 8750,
  "conversions": 125,
  "conversionRate": "3.65"
}
POST/createSite

Create a new site for tracking.

Request Body

{
  "name": "My Website",
  "domain": "example.com",
  "userId": "firebase-user-id"
}

Response

{
  "id": "uuid",
  "name": "My Website",
  "domain": "example.com",
  "ownerId": "firebase-user-id",
  "createdAt": "2024-01-15T10:00:00Z"
}
GET/getSites

Get all sites for a user.

Query Parameters

ParamTypeDescription
userIdstringRequired. Firebase user ID.

Response

{
  "sites": [
    {
      "id": "uuid",
      "name": "My Website",
      "domain": "example.com",
      "ownerId": "firebase-user-id",
      "createdAt": "2024-01-15T10:00:00Z"
    }
  ]
}
GET/checkSiteEvents

Check if a site has received any events (for verification).

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.

Response

{
  "hasEvents": true,
  "eventCount": 42,
  "lastEventAt": "2024-01-15T10:05:00Z",
  "sampleEvents": [
    {
      "eventType": "pageview",
      "eventName": null,
      "pagePath": "/",
      "timestamp": "2024-01-15T10:05:00Z"
    }
  ]
}

Analytics Endpoints

GET/getTimeSeries

Get metric values over time for charting.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.
metricstringRequired. One of: visitors, sessions, pageviews, conversions
startDatedateRequired. YYYY-MM-DD format.
endDatedateRequired. YYYY-MM-DD format.

Response

{
  "data": [
    { "date": "2024-01-01", "value": 150 },
    { "date": "2024-01-02", "value": 175 },
    { "date": "2024-01-03", "value": 142 }
  ]
}
GET/getTopPages

Get most viewed pages with visitor and view counts.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.
startDatedateRequired. YYYY-MM-DD format.
endDatedateRequired. YYYY-MM-DD format.
limitnumberOptional. Default: 20

Response

{
  "pages": [
    { "path": "/", "views": 1250, "visitors": 980 },
    { "path": "/pricing", "views": 540, "visitors": 420 },
    { "path": "/features", "views": 320, "visitors": 280 }
  ]
}
GET/getTrafficSources

Get session counts grouped by source and medium.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.
startDatedateRequired. YYYY-MM-DD format.
endDatedateRequired. YYYY-MM-DD format.

Response

{
  "sources": [
    { "source": "google", "medium": "organic", "sessions": 450 },
    { "source": "direct", "medium": null, "sessions": 320 },
    { "source": "twitter", "medium": "social", "sessions": 180 }
  ]
}
GET/getDeviceBreakdown

Get session counts by browser, OS, and device type.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.
startDatedateRequired. YYYY-MM-DD format.
endDatedateRequired. YYYY-MM-DD format.

Response

{
  "browsers": [
    { "name": "Chrome", "sessions": 650 },
    { "name": "Safari", "sessions": 280 },
    { "name": "Firefox", "sessions": 120 }
  ],
  "os": [
    { "name": "macOS", "sessions": 480 },
    { "name": "Windows", "sessions": 420 },
    { "name": "iOS", "sessions": 150 }
  ],
  "devices": [
    { "type": "desktop", "sessions": 780 },
    { "type": "mobile", "sessions": 250 },
    { "type": "tablet", "sessions": 20 }
  ]
}
GET/exportData

Export events, sessions, or visitors as JSON or CSV.

Query Parameters

ParamTypeDescription
siteIduuidRequired. Site identifier.
userIdstringRequired. Firebase user ID.
typestringRequired. One of: events, sessions, visitors
formatstringOptional. json (default) or csv
startDatedateOptional. YYYY-MM-DD format.
endDatedateOptional. YYYY-MM-DD format.
limitnumberOptional. Max rows. Default: 10000

Response (JSON)

{
  "data": [...],
  "count": 1500,
  "format": "json"
}

Response (CSV)

id,visitor_id,session_id,event_type,page_path,timestamp
abc123,v1,s1,pageview,/,2024-01-15T10:00:00Z
def456,v1,s1,pageview,/pricing,2024-01-15T10:01:00Z

Organization Endpoints

POST/createOrganization

Create a new organization. The creating user becomes the owner.

Request Body

{
  "name": "My Company",
  "userId": "firebase-user-id"
}

Response

{
  "id": "uuid",
  "name": "My Company",
  "slug": "my-company",
  "ownerId": "firebase-user-id",
  "createdAt": "2024-01-15T10:00:00Z"
}
GET/getOrganizations

Get all organizations the user belongs to.

Query Parameters

ParamTypeDescription
userIdstringRequired. Firebase user ID.

Response

{
  "organizations": [
    {
      "id": "uuid",
      "name": "My Company",
      "slug": "my-company",
      "ownerId": "user123",
      "role": "owner",
      "memberCount": 5,
      "siteCount": 3,
      "createdAt": "2024-01-15T10:00:00Z"
    }
  ]
}
POST/inviteMember

Invite a user to join an organization. Requires owner or admin role.

Request Body

{
  "orgId": "uuid",
  "email": "newmember@example.com",
  "role": "member",
  "userId": "firebase-user-id"
}

Available Roles

  • admin - Can manage members and sites
  • member - Can view and edit data
  • viewer - Read-only access

Response

{
  "id": "uuid",
  "email": "newmember@example.com",
  "role": "member",
  "invitedAt": "2024-01-15T10:00:00Z",
  "status": "pending"
}
GET/getOrganizationMembers

Get all members of an organization.

Query Parameters

ParamTypeDescription
orgIduuidRequired. Organization identifier.
userIdstringRequired. Firebase user ID.

Response

{
  "members": [
    {
      "id": "uuid",
      "userId": "user123",
      "email": "owner@example.com",
      "role": "owner",
      "acceptedAt": "2024-01-15T10:00:00Z"
    },
    {
      "id": "uuid",
      "userId": null,
      "email": "pending@example.com",
      "role": "member",
      "invitedAt": "2024-01-16T10:00:00Z",
      "acceptedAt": null
    }
  ]
}
PATCH/updateMemberRole

Update a member's role. Requires owner or admin role.

Request Body

{
  "orgId": "uuid",
  "memberId": "uuid",
  "role": "admin",
  "userId": "firebase-user-id"
}

Response

{ "success": true }
DELETE/removeMember

Remove a member from an organization. Requires owner or admin role.

Request Body

{
  "orgId": "uuid",
  "memberId": "uuid",
  "userId": "firebase-user-id"
}

Response

{ "success": true }
POST/acceptInvite

Accept a pending organization invitation.

Request Body

{
  "orgId": "uuid",
  "userId": "firebase-user-id",
  "email": "user@example.com"
}

Response

{
  "success": true,
  "organization": {
    "id": "uuid",
    "name": "My Company",
    "role": "member"
  }
}
POST/addSiteToOrg

Assign a site to an organization. Requires site ownership and org admin role.

Request Body

{
  "siteId": "uuid",
  "orgId": "uuid",
  "userId": "firebase-user-id"
}

Response

{ "success": true }

Error Handling

All endpoints return errors in a consistent format:

{
  "error": "Error message describing what went wrong"
}

Common Status Codes

  • 200 - Success
  • 400 - Bad request (missing parameters)
  • 403 - Forbidden (not authorized)
  • 404 - Not found
  • 429 - Rate limit exceeded
  • 500 - Internal server error