Auth API#

Xác thực người dùng: đăng nhập, đăng ký, quản lý token, mật khẩu, profile.

Base URL: https://apitest.likepion.com/api/v1


POST /auth/login — Đăng nhập #

Request:

{
  "email": "user@example.com",       // required, email
  "password": "secret123"            // required, min=8, max=128
}

Response (200):

{
  "success": true,
  "data": {
    "access_token": "eyJhbGci...",
    "refresh_token": "dGhpcyBp...",
    "expires_in": 3600,
    "token_type": "Bearer",
    "user": {
      "id": "uuid",
      "email": "user@example.com",
      "name": "User Name",
      "image": "https://...",
      "status": "active",
      "role": "user",
      "credits": 1000,
      "language": "vi",
      "country": "VN",
      "timezone": "Asia/Ho_Chi_Minh",
      "created_at": "2025-01-01T00:00:00Z"
    }
  }
}

Errors: 401 invalid_credentials, 403 account_locked / email_not_verified


POST /auth/register — Đăng ký #

Request:

{
  "name": "User Name",              // required, min=2, max=100
  "email": "user@example.com",      // required, email
  "password": "secret123",          // required, min=8, max=128
  "password_confirmation": "secret123"  // required, must match password
}

Response (201):

{
  "success": true,
  "data": {"message": "Registration successful, please verify your email"}
}

Errors: 409 email_exists


POST /auth/forgot-password #

Request:

{
  "email": "user@example.com"    // required, email
}

Response (200):

{"success": true, "data": {"message": "Password reset email sent"}}

POST /auth/reset-password #

Request:

{
  "token": "reset-token-string",     // required
  "new_password": "newpass123"        // required, min=8, max=128
}

Errors: 400 invalid_token / token_expired


POST /auth/verify-email #

Request:

{
  "token": "verify-token-string"    // required
}

Errors: 400 verify_invalid / verify_expired


POST /auth/resend-verification #

Request:

{
  "email": "user@example.com"    // required, email
}

POST /auth/refresh — Refresh Token #

Request: (hoặc gửi qua cookie)

{
  "refresh_token": "dGhpcyBp..."
}

Response (200):

{
  "success": true,
  "data": {
    "access_token": "eyJhbGci...",
    "expires_in": 3600,
    "token_type": "Bearer"
  }
}

POST /auth/logout #

Request: (hoặc gửi qua cookie)

{
  "refresh_token": "dGhpcyBp..."
}

GET /auth/me — Thông tin user (JWT) #

Response (200):

{
  "success": true,
  "data": {
    "id": "uuid",
    "email": "user@example.com",
    "email_verified_at": "2025-01-01T00:00:00Z",
    "name": "User Name",
    "image": "https://...",
    "status": "active",
    "role_id": "uuid",
    "role": {
      "id": "uuid",
      "name": "User",
      "slug": "user",
      "permissions": ["backlink.view", "backlink.create"]
    },
    "phone": "0901234567",
    "language": "vi",
    "country": "VN",
    "timezone": "Asia/Ho_Chi_Minh",
    "credits": 1000,
    "credits_used": 500,
    "credits_expires_at": "2026-01-01T00:00:00Z",
    "created_at": "2025-01-01T00:00:00Z",
    "updated_at": "2025-06-01T00:00:00Z"
  }
}

PUT /auth/change-password (JWT) #

Request:

{
  "current_password": "oldpass123",   // required
  "new_password": "newpass123"        // required, min=8, max=128
}

Errors: 401 password_incorrect


GET /user/profile (JWT) #

Response (200):

{
  "success": true,
  "data": {
    "id": "uuid",
    "email": "user@example.com",
    "name": "User Name",
    "image": "https://...",
    "status": "active",
    "phone": "0901234567",
    "role": "user",
    "language": "vi",
    "country": "VN",
    "timezone": "Asia/Ho_Chi_Minh",
    "credits": 1000,
    "credits_used": 500,
    "created_at": "2025-01-01T00:00:00Z",
    "updated_at": "2025-06-01T00:00:00Z"
  }
}

PUT /user/profile (JWT) #

Request: (tất cả optional)

{
  "name": "New Name",
  "phone": "0901234567",
  "language": "vi",
  "country": "VN",
  "timezone": "Asia/Ho_Chi_Minh"
}

PUT /user/avatar (JWT) #

Request:

{
  "image": "https://storage.example.com/avatar.jpg"   // required
}

DELETE /user/avatar (JWT) #

Xóa avatar, không cần body.


GET /user/dashboard (JWT) #

Response (200):

{
  "success": true,
  "data": {
    "stats": {
      "credits": 1000,
      "credits_used": 500,
      "credits_expires_at": "2026-01-01T00:00:00Z",
      "total_orders": 10,
      "pending_orders": 1,
      "failed_orders": 0
    },
    "recent_transactions": [
      {
        "id": "uuid",
        "type": "credit",
        "credits": 500,
        "description": "Package purchase",
        "status": "completed",
        "created_at": "2025-06-01T00:00:00Z"
      }
    ]
  }
}