diff --git a/lib/federation/activity_pub/actor.ex b/lib/federation/activity_pub/actor.ex
index 0cc3b589f..e5e12393b 100644
--- a/lib/federation/activity_pub/actor.ex
+++ b/lib/federation/activity_pub/actor.ex
@@ -76,14 +76,19 @@ defmodule Mobilizon.Federation.ActivityPub.Actor do
   @doc """
   Find an actor in our local database or call WebFinger to find what's its AP ID is and then fetch it
   """
-  @spec find_or_make_actor_from_nickname(String.t(), atom() | nil) :: tuple()
+  @spec find_or_make_actor_from_nickname(String.t(), atom() | nil) ::
+          {:ok, Actor.t()} | {:error, any()}
   def find_or_make_actor_from_nickname(nickname, type \\ nil) do
-    case Actors.get_actor_by_name(nickname, type) do
-      %Actor{} = actor ->
-        {:ok, actor}
+    case Actors.get_actor_by_name_with_preload(nickname, type) do
+      %Actor{url: actor_url} = actor ->
+        if Actors.needs_update?(actor) do
+          make_actor_from_url(actor_url, true)
+        else
+          {:ok, actor}
+        end
 
       nil ->
-        make_actor_from_nickname(nickname)
+        make_actor_from_nickname(nickname, true)
     end
   end
 
@@ -94,10 +99,10 @@ defmodule Mobilizon.Federation.ActivityPub.Actor do
   Create an actor inside our database from username, using WebFinger to find out its AP ID and then fetch it
   """
   @spec make_actor_from_nickname(String.t()) :: {:ok, %Actor{}} | {:error, any()}
-  def make_actor_from_nickname(nickname) do
+  def make_actor_from_nickname(nickname, preload \\ false) do
     case WebFinger.finger(nickname) do
       {:ok, url} when is_binary(url) ->
-        make_actor_from_url(url)
+        make_actor_from_url(url, preload)
 
       _e ->
         {:error, "No ActivityPub URL found in WebFinger"}
diff --git a/lib/web/cache/activity_pub.ex b/lib/web/cache/activity_pub.ex
index f32cf598f..d31b8cc2e 100644
--- a/lib/web/cache/activity_pub.ex
+++ b/lib/web/cache/activity_pub.ex
@@ -4,10 +4,11 @@ defmodule Mobilizon.Web.Cache.ActivityPub do
   """
 
   alias Mobilizon.{Actors, Discussions, Events, Posts, Resources, Todos, Tombstone}
-  alias Mobilizon.Actors.{Actor, Member}
+  alias Mobilizon.Actors.Actor, as: ActorModel
+  alias Mobilizon.Actors.Member
   alias Mobilizon.Discussions.{Comment, Discussion}
   alias Mobilizon.Events.Event
-  alias Mobilizon.Federation.ActivityPub.Relay
+  alias Mobilizon.Federation.ActivityPub.{Actor, Relay}
   alias Mobilizon.Posts.Post
   alias Mobilizon.Resources.Resource
   alias Mobilizon.Todos.{Todo, TodoList}
@@ -23,8 +24,8 @@ defmodule Mobilizon.Web.Cache.ActivityPub do
           {:commit, Actor.t()} | {:ignore, nil}
   def get_actor_by_name(name) do
     Cachex.fetch(@cache, "actor_" <> name, fn "actor_" <> name ->
-      case Actors.get_actor_by_name_with_preload(name) do
-        %Actor{} = actor ->
+      case Actor.find_or_make_actor_from_nickname(name) do
+        {:ok, %ActorModel{} = actor} ->
           {:commit, actor}
 
         nil ->
@@ -41,7 +42,7 @@ defmodule Mobilizon.Web.Cache.ActivityPub do
   def get_local_actor_by_name(name) do
     Cachex.fetch(@cache, "local_actor_" <> name, fn "local_actor_" <> name ->
       case Actors.get_local_actor_by_name(name) do
-        %Actor{} = actor ->
+        %ActorModel{} = actor ->
           {:commit, actor}
 
         nil ->