Skip to main content

Bulk imports and API access for Assets

Create, update, move and delete Assets with the Mobaro Public API: endpoints, settable fields, import order, and the traps in bulk imports and syncs.

Written by Logan Bowlby

Overview

The Mobaro Public API lets a script create, update, move and delete Assets. Use it for a one-time bulk import when you set up Mobaro, or to keep your Assets in step with a CMMS or asset register.

This article covers the Asset endpoints, the fields you can set, the order to import in, and the traps to avoid. For keys, headers and paging, see Getting started with the Mobaro API.

At a glance

Who can do this

Your integration, with an API key that isn't Read-only. Keys are created by users with Organization › Administrate.

Where

Public API, /api/customers/assets. Keys: Configuration › API › API Keys

Works on

Public API

Availability

Enabled per organization by Mobaro — ask your CSM

💡 Why this matters: Creating hundreds of Assets by hand is slow and error-prone. A re-runnable script gets you to a working Asset library quickly and keeps it matched to your source system.

ℹ️ Note: The Asset endpoints are labelled (BETA) in the Mobaro API documentation: they may change. Check the documentation for the current request and response schemas.


The Asset endpoints

Operation

Endpoint

Notes

List

GET /api/customers/assets

Filter by Locations, Parents and created or updated dates.

Get one

GET /api/customers/assets/{id}

{id} can be the Mobaro ID or your External ID.

History

GET /api/customers/assets/{id}/activities

The Asset's activity history.

Create

POST /api/customers/assets

One Asset per request. Returns the new ID.

Update

PUT /api/customers/assets/{id}

Changes fields only, not the Location or parent.

Move

POST /api/customers/assets/move

New parent: a Location or an Asset.

Delete

DELETE /api/customers/assets/{id}

Also deletes every descendant.

Property lists

GET /api/customers/assets/property-definition

IDs of Manufacturers, their Models, and Categories.

There's no endpoint that takes several Assets at once: send one request per Asset.


Fields you can set

  • name: required on create.

  • location: required on create. The Mobaro ID of an existing Location, for example locations/123456-A.

  • parent: optional. The Mobaro ID of an Asset at the same Location. Leave it out for a top-level Asset.

  • description, externalId, code, serial: free text.

  • manufacturer, model, category: IDs from the property-definition endpoint. Mobaro maintains these lists.

PUT accepts the same fields except location and parent. Short name and Custom Scanner Code can only be set in the Backend. For what each field means, see Understanding Asset fields and properties. For ID formats, see Understanding IDs in Mobaro.


Import Assets in the right order

1. Prepare your source data

Use one row per Asset, with its Name, Location, parent, External ID and any other fields. Put the identifier from your source system in External ID: it's what lets you find the Asset again.

2. Look up the IDs you need

Get your Location IDs with GET /api/customers/locations, and Manufacturer, Model and Category IDs from the property-definition endpoint. Create any missing Locations first.

3. Create parents before children

Sort your rows by depth in the hierarchy and create top-down. Keep a map of External ID to the Mobaro ID each create returns, and use it to fill in parent for the next level.

🛑 Critical: A child can only be created once its parent exists, at the same Location. If you create children first, or point at a parent at another Location, those Assets aren't created and your hierarchy is incomplete.

4. Check the result

List the Assets for each Location and compare them with your source. Spot-check the children and descendants of key parents. See Asset hierarchies and parent/child relationships.


Example: create a child Asset

curl "https://app.mobaro.com/api/customers/assets" \
--request POST \
--header "Content-Type: application/json" \
--header "X-Api-Key: YOUR_API_KEY" \
--data '{
"name": "MCC1",
"description": "Maintenance Control Panel 1",
"externalId": "MCC1-GC-001",
"location": "locations/123456-A",
"parent": "assets/234567-B"
}'

The response contains the new Asset's ID.


Move or delete Assets

To give an Asset a new parent, or move it to another Location, send POST /api/customers/assets/move with Asset (the Asset's ID) and Parent (a Location ID for a top-level position, or an Asset ID):

curl "https://app.mobaro.com/api/customers/assets/move?Asset=assets/345678-C&Parent=assets/234567-B" \
--request POST \
--header "X-Api-Key: YOUR_API_KEY"

A move works like Move in the Backend: the Asset's whole branch moves with it, you can't move an Asset under itself or its descendants, and RideOps Assets can't be moved. Moving to another Location also moves the Assets' Assignments there. See Linking Assets to Locations.

🛑 Critical: DELETE removes the Asset and all of its descendants, and takes them off every Schedule that targets them. It can't be undone. A sync script that deletes a parent row deletes the whole branch.


Common traps

  • Duplicates: Mobaro doesn't check Names or External IDs for uniqueness, so re-running a create-only script duplicates Assets. Look each row up first with GET /api/customers/assets/{externalId}: a 404 means create, a match means update.

  • Rate limits: each key can make up to 10 requests per second. Above that you get 429 Too Many Requests; wait and retry. See Handling errors, rate limits, and retry logic.

  • Read-only keys: creates, updates, moves and deletes return 403 Forbidden.

  • Wrong endpoint for moves: PUT ignores parent and location. Use the move endpoint.


Best practices

  • Make the script re-runnable: look each row up by External ID, then create or update.

  • Test with ten or twenty rows that include your deepest hierarchy and trickiest names before running everything.

  • Add a dry-run mode that logs what would be created, and review it for missing parents and wrong Locations.

  • Run your first full import on one Location, and send requests one after another rather than in parallel, so children never race ahead of parents.

  • Keep your source data and scripts in version control, and log every delete.


Frequently asked questions

I need to create 60 child assets (seats 1–60). Is there a quicker way than one by one?

Yes, with the Public API. A short script can send one POST /api/customers/assets per seat, each with the same parent and location. The Backend's asset tree creates Assets one at a time.

How do I move assets under another asset with the API? PUT ignores the parent.

Use POST /api/customers/assets/move with Asset and the new Parent (a Location ID or an Asset ID). PUT only changes an Asset's fields, never its Location or parent. The Asset's children move with it.

Is there a CSV or Excel import for assets?

No, not in the Backend. Read your file in a script and send one create request per row, parents first. For low-code flows, the Power Automate connector has the same Asset actions; see Getting started with Mobaro's Power Automate connector.

Can I set the short name or scanner code through the API?

No. The API can set Name, Description, External ID, Code, Serial, Manufacturer, Model, Category, Location and parent. Set Short name and Custom Scanner Code in the Backend; see Understanding Asset fields and properties.

Which permission does the API need to create assets?

None beyond the key. An API key acts with Super User access to your organization, so any key that isn't Read-only can create, edit, move and delete Assets at every Location. A Read-only key gets 403 Forbidden.

Did this answer your question?