Location Tracker API v1.0

Real-time family location tracking API โ€” Built with Laravel 9 + Sanctum + Socket.IO

http://127.0.0.1:8000/api
No Token

๐Ÿ‘ค Quick User Switcher

DEV TOOL โ€” Kisi bhi user ka token instantly get karo, manually user_id select karo โ–ผ
โณ Switching...
Click "Load All Users" to see all registered users...

๐Ÿ” Authentication

โ–ผ
POST /auth/register PUBLIC Register / Login user (phone-based) โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
namestringRequired
phonestringRequired
roleenumRequired
fcm_tokenstringOptional
circlesarrayOptional

Role values: parent, family_caregiver, partner, friend, other

circles: [{name: "Family"}, {name: "Friends"}]

๐Ÿ“ฅ Response (201)
{
  "success": true,
  "message": "User registered successfully",
  "data": {
    "user": { "id": 1, "name": "...", "phone": "...", "role": "parent" },
    "token": "1|abc...",
    "circles": [{ "id": 1, "name": "Family", "invite_code": "ABC-DEF" }]
  }
}
GET /auth/me ๐Ÿ”’ Get current user profile + token info โ–ผ
๐Ÿ“ค Request

No body required. Send Bearer token in header.

๐Ÿ“ฅ Response (200)
{
  "success": true,
  "data": {
    "user": { "id": 1, "name": "...", "role": "parent", "latest_location": null },
    "token_info": { "token_id": 1, "token_name": "auth_token", "last_used_at": "..." }
  }
}
PUT /auth/profile ๐Ÿ”’ Update user profile (name, avatar) โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
namestringOptional
avatar_urlstring (url)Optional
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Profile updated successfully",
  "data": { "id": 1, "name": "New Name", "avatar_url": null }
}
PUT /auth/fcm-token ๐Ÿ”’ Update FCM push notification token โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
fcm_tokenstringRequired
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "FCM token updated successfully"
}
POST /auth/logout ๐Ÿ”’ Logout โ€” delete current token โ–ผ
๐Ÿ“ค Request

No body required. Token will be deleted from server.

๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Logged out successfully"
}

โญ• Circles โ€” CRUD

โ–ผ
GET /circles ๐Ÿ”’ List all my circles โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "data": [
    {
      "id": 1, "name": "Family", "user_id": 1,
      "invite_code": "ABC-DEF",
      "owner": { "id": 1, "name": "...", "phone": "..." },
      "members": [{ "id": 1, "name": "...", "pivot": { "role": "admin" } }]
    }
  ]
}
POST /circles ๐Ÿ”’ Create a new circle โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
namestringRequired
๐Ÿ“ฅ Response (201)
{
  "success": true,
  "message": "Circle created successfully",
  "data": {
    "circle": { "id": 1, "name": "Family", "invite_code": "ABC-DEF" },
    "invite_link": "http://localhost/join?code=ABC-DEF"
  }
}
GET /circles/{id} ๐Ÿ”’ Get circle details with members & places โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "data": {
    "id": 1, "name": "Family",
    "owner": { ... },
    "members": [ ... ],
    "places": [ ... ]
  }
}
PUT /circles/{id} ๐Ÿ”’ Update circle name (owner only) โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
namestringRequired
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Circle updated successfully",
  "data": { "id": 1, "name": "Updated Name" }
}
DELETE /circles/{id} ๐Ÿ”’ Delete circle (owner only) โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Circle deleted successfully"
}

โšก Circle Actions

โ–ผ
POST /circles/join ๐Ÿ”’ Join circle with invite code โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
invite_codestringRequired

Format: ABC-DEF (expires in 24 hours)

๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Successfully joined the circle",
  "data": { "id": 1, "name": "Family", "members": [...] }
}
POST /circles/{id}/leave ๐Ÿ”’ Leave a circle (non-owner) โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "You have left the circle"
}
POST /circles/{id}/remove-member ๐Ÿ”’ Remove a member (owner only) โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
user_idintegerRequired
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Member removed successfully"
}
POST /circles/{id}/regenerate-code ๐Ÿ”’ Regenerate invite code (owner only) โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Invite code regenerated successfully",
  "data": {
    "invite_code": "XYZ-ABC",
    "invite_code_expires_at": "2026-03-30T16:00:00Z",
    "invite_link": "http://localhost/join?code=XYZ-ABC"
  }
}
GET /circles/{id}/members-locations ๐Ÿ”’ Get all members' latest locations โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "data": [
    {
      "id": 1, "name": "User",
      "latest_location": {
        "latitude": "24.860", "longitude": "67.001",
        "battery_level": 85, "is_moving": false
      }
    }
  ]
}

๐Ÿ“ Locations

โ–ผ
POST /locations ๐Ÿ”’ Save single location (also emits via Socket.IO) โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
latitudenumber (-90 to 90)Required
longitudenumber (-180 to 180)Required
battery_levelinteger (0-100)Optional
activity_typeenumOptional
is_movingbooleanOptional
recorded_atdatetimeOptional

activity_type: still, walking, running, driving, cycling, unknown

๐Ÿ“ฅ Response (201)
{
  "success": true,
  "message": "Location saved successfully",
  "data": {
    "id": 1, "latitude": "24.860",
    "longitude": "67.001", "battery_level": 85
  }
}
POST /locations/batch ๐Ÿ”’ Save multiple locations (offline sync) โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
locationsarray (max 500)Required
locations.*.latitudenumberRequired
locations.*.longitudenumberRequired
locations.*.recorded_atdatetimeRequired
locations.*.battery_levelintegerOptional
๐Ÿ“ฅ Response (201)
{
  "success": true,
  "message": "3 locations saved successfully",
  "data": { "saved_count": 3 }
}
GET /locations/history ๐Ÿ”’ Get location history (with date filter) โ–ผ
๐Ÿ“ค Query Parameters
FieldTypeRequired
fromdate (YYYY-MM-DD)Optional
todate (YYYY-MM-DD)Optional
limitinteger (1-1000)Optional (default: 100)
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "data": [
    { "id": 1, "latitude": "24.860", "longitude": "67.001",
      "recorded_at": "2026-03-29T16:12:55Z" }
  ]
}

๐Ÿ  Places / Geofences

โ–ผ
GET /circles/{circleId}/places ๐Ÿ”’ List all places in a circle โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "data": [
    { "id": 1, "name": "Home", "latitude": "24.860",
      "longitude": "67.001", "radius": 100,
      "address": "Clifton, Karachi",
      "creator": { "id": 1, "name": "User" } }
  ]
}
POST /circles/{circleId}/places ๐Ÿ”’ Create a new place/geofence โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
namestringRequired
latitudenumberRequired
longitudenumberRequired
radiusinteger (meters)Required
addressstringOptional
๐Ÿ“ฅ Response (201)
{
  "success": true,
  "message": "Place created successfully",
  "data": { "id": 1, "name": "Home", "radius": 100 }
}
PUT /circles/{circleId}/places/{placeId} ๐Ÿ”’ Update a place โ–ผ
๐Ÿ“ค Request Body
FieldTypeRequired
namestringOptional
latitudenumberOptional
longitudenumberOptional
radiusintegerOptional
addressstringOptional
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Place updated successfully",
  "data": { "id": 1, "name": "My Home", "radius": 150 }
}
DELETE /circles/{circleId}/places/{placeId} ๐Ÿ”’ Delete a place โ–ผ
๐Ÿ“ฅ Response (200)
{
  "success": true,
  "message": "Place deleted successfully"
}