Complete documentation for the FlowStake Activity Ledger and Proof of Activity as a Stake protocol
The FlowStake API provides endpoints for activity verification, challenge management, and reward distribution through the Distributed Immutable Activity Ledger (DIAL) system.
Production: https://api.flowstake.com
Development: http://localhost:3000
All requests must include a valid JWT token:
Authorization: Bearer <token>
interface Activity {
id: string;
user_id: string;
strava_activity_id: string;
type: string;
distance: number;
duration: number;
elevation_gain: number;
start_date: string;
verified: boolean;
created_at: string;
updated_at: string;
ipfs_hash?: string;
attestation_uid?: string;
challenge?: {
id: string;
type: string;
challenge_type: 'solo' | 'group';
participants: {
id: string;
participant_id: string;
ens_name?: string;
eth_address?: string;
completion_status: 'pending' | 'completed' | 'failed';
distance_completed: number;
time_completed: number;
profiles?: {
name: string | null;
avatar_url: string | null;
};
}[];
};
}
interface TrackPoint {
timestamp: string;
latitude: number;
longitude: number;
elevation: number;
distance: number;
heartRate?: number;
cadence?: number;
power?: number;
}
interface ActivityMetadata {
type: string;
distance: number;
duration: number;
elevationGain: number;
startDate: string;
device?: string;
athlete?: string;
}
struct ActivityAttestation {
address athlete;
uint256 timestamp;
string activityType;
uint256 distance;
uint256 duration;
bytes32 proof;
}
POST /api/activities/attest
Content-Type: application/json
Authorization: Bearer <token>
{
"activity": {
"type": "running",
"distance": 5000,
"duration": 1800,
"elevationGain": 100,
"startDate": "2024-03-27T10:00:00Z"
},
"trackpoints": [
{
"timestamp": "2024-03-27T10:00:00Z",
"latitude": 40.7128,
"longitude": -74.0060,
"elevation": 10,
"distance": 0
}
]
}
GET /api/activities
Authorization: Bearer <token>
POST /api/activities/:id/verify
Authorization: Bearer <token>
{
"verifier": "0x...",
"signature": "0x..."
}
interface Challenge {
id: string;
creator_id: string;
type: 'individual' | 'team' | 'lastStanding' | 'relay';
activity_type: 'running' | 'cycling' | 'walking' | 'swimming';
token_type: 'ETH' | 'USDC' | 'FST';
stake_amount: number;
target_distance?: number;
target_time?: number;
start_date: string;
end_date: string;
min_participants?: number;
max_participants?: number;
status: 'pending' | 'active' | 'completed' | 'cancelled';
description?: string;
}
POST /api/challenges
Content-Type: application/json
Authorization: Bearer <token>
{
"type": "individual",
"activityType": "running",
"tokenType": "ETH",
"stakeAmount": 0.1,
"targetDistance": 5000,
"startDate": "2024-04-01T00:00:00Z",
"endDate": "2024-04-07T23:59:59Z"
}
POST /api/challenges/:id/join
Authorization: Bearer <token>
{
"ensName": "athlete.eth",
"ethAddress": "0x..."
}
PUT /api/challenges/:id/progress
Authorization: Bearer <token>
{
"distance": 2500,
"time": 900
}
interface IActivityVerifier {
function verifyActivity(
bytes32 activityId,
uint256 timestamp,
string activityType,
uint256 distance,
uint256 duration,
bytes32 proof
) external returns (bool);
function getVerification(bytes32 activityId) external view returns (
bool verified,
address verifier,
uint256 timestamp
);
event ActivityVerified(
bytes32 indexed activityId,
address indexed verifier,
uint256 timestamp
);
}
interface IFlowstakeChallenge {
function createChallenge(
ActivityType activityType,
TokenType tokenType,
uint256 stakeAmount,
uint256 targetDistance,
uint256 targetTime,
uint256 startDate,
uint256 duration
) external payable returns (uint256);
function joinChallenge(uint256 challengeId) external payable;
function submitActivity(
uint256 challengeId,
bytes32 activityId,
uint256 distance,
uint256 time
) external;
function claimRewards(uint256 challengeId) external;
}
All API endpoints return standard HTTP status codes:
Error Response Format:
{
"error": {
"code": "ERROR_CODE",
"message": "Human readable error message",
"details": {}
}
}
Activities are stored on IPFS with the following structure:
{
"metadata": {
"type": "running",
"distance": 5000,
"duration": 1800,
"elevationGain": 100,
"startDate": "2024-03-27T10:00:00Z",
"device": "Garmin Forerunner 945",
"athlete": "0x..."
},
"trackpoints": [
{
"timestamp": "2024-03-27T10:00:00Z",
"latitude": 40.7128,
"longitude": -74.0060,
"elevation": 10,
"distance": 0,
"heartRate": 140,
"cadence": 180,
"power": 250
}
],
"proof": {
"hash": "0x...",
"signature": "0x...",
"attestationUid": "0x..."
}
}