Why does Create Meeting endpoint sometimes return a user's Personal Meeting Room?

Description
If I use the (POST /users/{zoom_account_email}/meetings) endpoint to attempt to create a new instant meeting for a user, sometimes it instead returns the user’s Personal Meeting Room details rather than creating a new room, depending on which user is passed.

Why is the Personal Meeting Room returned for certain users?

Which App Type (OAuth / Chatbot / JWT / Webhook)?
JWT

Which Endpoint/s?
POST /users/{zoom_account_email}/meetings
https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate

How To Reproduce (If applicable)

  1. Consider the following Python code to create an instant meeting using the Zoom API:
host_zoom_user_id = ...  # a Zoom email
meeting_password = ...  # something random
token = ...  # JWT token

zoom_request = Request(
    # https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate
    url='https://api.zoom.us/v2/users/%s/meetings' % urllib.parse.quote(host_zoom_user_id),
    method='POST',
    data=json.dumps(dict(
        topic='',
        type=1,  # 1 = instant meeting
        start_time=None,
        duration=None,
        timezone=None,
        password=meeting_password,
        agenda='',
        recurrence=None,
        settings=dict(
            host_video=True,
            participant_video=True,
            cn_meeting=False,
            in_meeting=False,
            join_before_host=False,  # ignored for instant meetings
            mute_upon_entry=True,
            watermark=False,
            use_pmi=False,  # generate a new meeting ID
            approval_type=0,  # 0 = automatically approve
            registration_type=1,  # ignored for instant meetings
            audio='voip',  # only allow join with computer audio
            auto_recording='none',
            enforce_login=False,
            enforce_login_domains='',  # ignored for enforce_login=False
            alternative_hosts='',
            global_dial_in_countries=[],
            registrants_email_notification=False,
        ),
    )).encode('utf8'),
    headers={
        'Authorization': 'Bearer ' + token,
        'Content-Type': 'application/json',
        'Accept': 'application/json',
    },
)
  1. Use the code with the email “david.foster+zoomdemo@techsmart.codes”. Get back an API response describing a new instant meeting, as expected:
{
    'uuid': 'NVOHbojwR52RuGCtg68ufA==',
    'id': ***********,  // 11 digits
    'host_id': 'rkf8kTCBRDSJhINS4UxrvA',
    'topic': 'Zoom Meeting',
    'type': 1,
    'status': 'waiting',
    'timezone': 'America/Los_Angeles',
    'created_at': '2020-05-04T21:06:00Z',
    'start_url': ...,
    'join_url': ...,
    'password': ...,
    'h323_password': ...,
    'pstn_password': ...,
    'encrypted_password': ...,
    'settings': {
        'host_video': True,
        'participant_video': True,
        'cn_meeting': False,
        'in_meeting': False,
        'join_before_host': False,
        'mute_upon_entry': True,
        'watermark': False,
        'use_pmi': False,
        'approval_type': 2,
        'audio': 'voip',
        'auto_recording': 'none',
        'enforce_login': False,
        'enforce_login_domains': '',
        'alternative_hosts': '',
        'close_registration': False,
        'registrants_confirmation_email': True,
        'waiting_room': False,
        'contact_name': 'David Foster (Demo)',
        'contact_email': 'david.foster+zoomdemo@techsmart.codes',
        'registrants_email_notification': False,
        'meeting_authentication': False
    }
}
  1. Use the code with the email “andrew.lo@techsmart.codes”. Get back an API response describing a Personal Meeting Room, which is surprising:
{
    'uuid': ...,
    'id': ##########,  // 10 digits
    'host_id': ...,
    'topic': "Andrew Lo's Personal Meeting Room",
    'type': 1,
    'status': 'waiting',
    'timezone': 'America/Los_Angeles',
    'agenda': '',
    'created_at': '2020-05-04T21:03:36Z',
    'start_url': ...,
    'join_url': ...,
    'settings': {
        'host_video': True,
        'participant_video': True,
        'cn_meeting': False,
        'in_meeting': False,
        'join_before_host': True,
        'mute_upon_entry': False,
        'watermark': False,
        'use_pmi': False,
        'approval_type': 2,
        'audio': 'both',
        'enforce_login': False,
        'close_registration': False,
        'registrants_confirmation_email': False,
        'waiting_room': False,
        'registrants_email_notification': True,
        'meeting_authentication': False
    }
}

*This post has been edited to remove any meeting / webinar IDs

If the user’s account is set to use PMI for instant meetings, I don’t think the “use_pmi” flag for the Create Meeting API does anything to change the user’s settings. I’ve personally gotten around this (and other instant meeting oddities) by using the API to create Scheduled Meetings for the current time, instead of Instant Meetings.

Thanks for your answer @samly!!