HOW TO
After the September 2025 release of ArcGIS Field Maps, the handling of markups on the map has changed. The primary difference is the new and improved personal markup experience, which consolidates all individual markups into a single comprehensive layer. However, the layer does not display in ArcGIS Online. Displaying the layer in ArcGIS Online enables users to share, manage, analyze, and reuse personal markups across devices and applications as part of broader GIS workflows.
This article outlines the workflows to publish a personal markup from a map as a hosted feature layer, incorporating point, line, and polygon features from the ArcGIS Field Maps mobile app into ArcGIS Online using Python.

Note: To publish saved markups across all maps in the app, skip Step 2. Esri recommends to reload all related maps in the app first before before proceeding to Step 3.

Note: Skip Step 4 if the JSON file is not used.

The following procedures can be performed in Python IDLE for ArcGIS Pro or ArcGIS Notebooks in ArcGIS Online.
In Python IDLE for ArcGIS Pro
from arcgis.gis import GIS
import json
#initialize constants for the output feature layer
FEATURE_LAYER_ITEM = "<new feature layer ID>"
#edit the layer IDs accordingly, depending on the configuration of the new sublayers during the new feature layer creation in Step 5 above.
POINTS_LAYER_ID = 0
LINES_LAYER_ID = 1
POLYGONS_LAYER_ID = 2
#connect to gis using built-in user
gis = GIS("home")
#open and read the markup file
with open(r"<path to the markup file on the local machine>") as f:
markup_json = json.load(f)
feature_layer = gis.content.get(FEATURE_LAYER_ITEM)
#add or remove the sections below accordingly, depending on the type of sublayers to publish. In this example, three sections are applied for the three sublayers (point, line, and polygon) created.
feature_layer_collection = feature_layer.layers[POINTS_LAYER_ID]
elements = [
element
for element in markup_json["elements"]
if element.get("geometry", {}).get("x")
]
result = feature_layer_collection.edit_features(use_global_ids=True, adds=elements)
print(result)
feature_layer_collection = feature_layer.layers[LINES_LAYER_ID]
elements = [
element
for element in markup_json["elements"]
if element.get("geometry", {}).get("paths")
]
result = feature_layer_collection.edit_features(use_global_ids=True, adds=elements)
print(result)
feature_layer_collection = feature_layer.layers[POLYGONS_LAYER_ID]
elements = [
element
for element in markup_json["elements"]
if element.get("geometry", {}).get("rings")
]
result = feature_layer_collection.edit_features(use_global_ids=True, adds=elements)
print(result)


In ArcGIS Notebooks in ArcGIS Online
Note: By default, when inserting the markup file from Files to the notebook, a new code cell is added with the format: dataset = '<path>'. Ensure to only copy and paste the <path> portion to the script below for <path to the markup file uploaded to Files> and delete the new cell.
from arcgis.gis import GIS
import json
#initialize constants for the output feature layer
FEATURE_LAYER_ITEM = "<new feature layer ID>"
#edit the layer IDs accordingly, depending on the configuration of the new sublayers during the new feature layer creation in Step 5 above.
POINTS_LAYER_ID = 0
LINES_LAYER_ID = 1
POLYGONS_LAYER_ID = 2
#connect to gis using built-in user
gis = GIS("home")
#open and read the markup file
with open("<path to the markup file uploaded to Files>") as f:
markup_json = json.load(f)
feature_layer = gis.content.get(FEATURE_LAYER_ITEM)
#add or remove the sections below accordingly, depending on the type of sublayers to publish. In this example, three sections are applied for the three sublayers (point, line, and polygon) created.
feature_layer_collection = feature_layer.layers[POINTS_LAYER_ID]
elements = [
element
for element in markup_json["elements"]
if element.get("geometry", {}).get("x")
]
result = feature_layer_collection.edit_features(use_global_ids=True, adds=elements)
print(result)
feature_layer_collection = feature_layer.layers[LINES_LAYER_ID]
elements = [
element
for element in markup_json["elements"]
if element.get("geometry", {}).get("paths")
]
result = feature_layer_collection.edit_features(use_global_ids=True, adds=elements)
print(result)
feature_layer_collection = feature_layer.layers[POLYGONS_LAYER_ID]
elements = [
element
for element in markup_json["elements"]
if element.get("geometry", {}).get("rings")
]
result = feature_layer_collection.edit_features(use_global_ids=True, adds=elements)
print(result)


Article ID: 000038800
Get help from ArcGIS experts
Start chatting now