How to retrieve Laravel Passport access token expiration duration or datetime?

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

How to Retrieve Laravel Passport Access Token Expiration Duration or Datetime

As developers building secure APIs with Laravel and Passport, managing token lifecycles is crucial. When configuring token expiration using methods like Passport::tokensExpireIn(), we set policy boundaries for when tokens should expire. However, once a token is issued, retrieving that specific expiration data dynamically within your application logic can be a common requirement—whether for display purposes, custom rate limiting, or proactive renewal checks.

This post addresses how you can retrieve the exact expiration time or duration (in seconds) associated with a Laravel Passport access token, especially in the context of your existing setup using the First-Party App flow.

Understanding Token Expiration in Passport

In a standard Laravel Passport implementation, when you use createToken(), Passport stores the relevant expiration information directly within the associated token model record in your database. This data is managed by Laravel's Eloquent ORM and Carbon date handling.

The configuration methods you used:

php
Passport::tokensExpireIn(Carbon::now()->addDays(30));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(60));

These methods set the default expiration rules for newly created tokens. When a token is generated, these defaults are used to calculate the actual expires_at timestamp stored on the token record.

To retrieve this information, you need to access the Eloquent model associated with the token rather than relying solely on the calculated duration placed in the response.

Retrieving Expiration Data from the Token Model

The most reliable way to get the exact expiration time is by accessing the expires_at attribute directly from the token model instance retrieved after successful authentication or token validation.

When you retrieve a token via $user->tokens(), you gain access to the full Eloquent models containing all the necessary details, including the precise timestamp.

Here is how you can modify your controller action to dynamically calculate and return the expiration data:

Example Implementation

In your apiLogin action, instead of hardcoding the expires_in value (which is a duration), you should retrieve the calculated expiration date from the token object itself.

php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User; // Assuming your User model handles tokens, or use Passport's Token model if necessary
use Carbon\Carbon;

public function apiLogin(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        // Authentication passed...
        $user = Auth::user();

        // 1. Create the token
        $token = $user->createToken('API Access')->accessToken;

        // 2. Retrieve the actual expiration time from the created token model
        $expirationTime = $token->expires_at;

        // 3. Calculate the duration in seconds for explicit reporting (optional)
        $expiresInSeconds = $expirationTime->diffInSeconds(Carbon::now());

        return response()->json([
            "token_type" => "Bearer",
            "expires_in_seconds" => $expiresInSeconds, // The actual number of seconds remaining
            "expires_at" => $expirationTime,          // The exact datetime object
            "access_token" => $token->plainTextToken // Use plainTextToken for API responses
        ]);
    }

    return response()->json(["error" => "invalid_credentials", "message" => "The user credentials were incorrect."], 401);
}

Explanation of the Approach

  1. Accessing expires_at: After calling $user->createToken(), the resulting token object (or the associated model) contains the expires_at timestamp, which is a Carbon instance. This timestamp is set based on your configuration in AuthServiceProvider.
  2. Calculating Duration (diffInSeconds): To get the duration remaining, you use the powerful Carbon method diffInSeconds(), comparing the stored expires_at with the current time (Carbon::now()). This provides a dynamic, real-time calculation of the token's lifespan in seconds.
  3. Data Return: By returning both the full expires_at datetime and the calculated expires_in_seconds, you provide the client application with all necessary information to manage its session effectively, adhering to best practices for API communication discussed in guides like those found on the official Laravel documentation.

Conclusion

Retrieving token expiration details is not something that should be hardcoded but rather a dynamic calculation based on the stored data. By leveraging Eloquent models and Carbon's date manipulation capabilities within your controller logic, you ensure that your application always reflects the true state of the token lifecycle. This approach keeps your system flexible, accurate, and robust, aligning perfectly with the principles of clean data management advocated by Laravel.