How can I have multiple areas open but only add a panel to one of them with Python?
Use the poll method

Test script, using Text Editor &gt; Templates &gt; Python &gt; UI Panel Simple and adding a poll method such that only the largest PROPERTIES type area in the screen areas polls
class HelloWorldPanel(bpy.types.Panel):
    &quot;&quot;&quot;Creates a Panel in the Object properties window&quot;&quot;&quot;
    bl_label = &quot;Hello World Panel&quot;
    bl_idname = &quot;OBJECT_PT_hello&quot;
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = &quot;object&quot;
    
    @classmethod
    def poll(cls, context):
        areas = sorted(
            (a for a in context.screen.areas if a.type == 'PROPERTIES'),
             key=lambda a: a.width * a.height)

        return areas and context.area == areas[-1]

other methods to consider would be looking for the lowest index type area in the screen collection.  As a rule of thumb when enumerating the screen areas collection, recently split off areas are added last.
&gt;&gt;&gt; for i, a in enumerate(C.screen.areas):
...     i, a.type
...     
(0, 'PROPERTIES')
(1, 'CONSOLE')
(2, 'OUTLINER')
(3, 'PROPERTIES')
(4, 'TEXT_EDITOR')

&gt;&gt;&gt; C.screen.areas[:].index(C.area)
1

A property can be saved on the screen object.  Using a group property that keeps track of area index and type is another method I've used in the past to attach a draw callback to only one instance of an area in a screen.
&gt;&gt;&gt; bpy.types.Screen.my_panel_area_index = bpy.props.IntProperty()
&gt;&gt;&gt; C.screen.my_panel_area_index
0