Nira HTTP API
Download OpenAPI specification:Download
Getting Started
Before getting started with Nira's HTTP API, be sure you know your organization's Nira URL prefix (e.g. your-organization.nira.app). Visit the login page if you need any help locating it.
You will also need an API key. To generate one, log in to your Nira organization as an administrator, click the Hamburger menu (Upper left corner), then API Keys → Add. Your API key must be included as the value of the x-api-key HTTP header with every request that you make.
Your API requests should be made to your Nira organization's hostname. For example, if your Nira organization's hostname is your-organization.nira.app, the full request URL to retrieve a list of your user groups would be https://your-organization.nira.app/api/groups
OpenAPI specification
The specification for this API is available as YAML and JSON for use with Postman, Swagger UI and client generators. The x-api-key header is declared as the ApiKeyAuth security scheme.
Can't find the API call that you need?
Nira's HTTP API is intentionally simple, as our most requested programmability is exposed in the JavaScript SDK Viewer class. Additional API calls can be added upon request -- simply reach out with a brief description of your use case.
Upload automation
For automation of asset uploads, we typically suggest using our python-based niraclient uploader. If you'd like to implement upload automation using your own code, please reach out with a brief description of your use case and we will provide our low-level upload API documentation.
Enterprise plan required
HTTP API access requires a customized Enterprise plan. Please contact us with any questions.
Software vendor integrations
If you are a software vendor interested in adding Nira upload capabilities into your application, please contact us.
| uuid | string <uuid> Nira's unique identifier for the callout. Always present in exported callouts. When importing callouts:
|
| numericId | integer The callout's place in its asset's label sequence, counting from 1. Present in exports and ignored on import, where Nira always assigns it. On import, Nira assigns these in payload order, so the row order in
your file decides the numbering. In |
| alphanumericId | string The callout's label as users see it in the 3D view, the Layers panel
and PDF reports. It is The sequence counts in base 35, running 1 to 9 and then A to Z, so 9
is A9, 10 is AA, 36 is B1, and 911 is AA1. Sorting a spreadsheet by
this column only matches the real order for the first 910 callouts on
an asset, because as text AA1 sorts before AZ. Sort by |
| title | string Title for Annotation and Camera Bookmarks. Also see defectTitle parameter. |
| poiDescription | string Description text for CameraBookmark callouts. This is the text box shown in the 3D view next to the callout. Whether the box is displayed is controlled by |
| externalId | string <= 255 characters Your own identifier for the callout, up to 255 characters, unique among the live callouts of an asset. Nira stores and returns it but never generates one. Returned in every export, empty when unset. When importing callouts:
|
| content | Array of objects Rich-text body content for Annotation callouts, produced by Nira's
Slate-based editor. It is an array of block nodes, each of the form
|
| type | string Default: "CameraBookmark" Enum: "Annotation" "Defect" "Measurement" "CameraBookmark" Specifies the type of callout. Measurement callouts are also referred
to as Polyline Callouts. These values correspond to the Callout Type
labels shown in the Nira app as follows: |
| schemaVersion | integer The version of the callout data format. Always specify 2. Version 1, or omitting this field, is a legacy format and should not be used. |
| posX | number <double> X coordinate for point callouts. When |
| posY | number <double> Y coordinate for point callouts. When |
| posZ | number <double> Z coordinate for point callouts. Elevation is always expressed in the coordinate system of the asset's source geometry files (e.g. meters if the source files use meters). It is not converted between vertical datums. |
| camPosX | number <double> Camera position X coordinate. |
| camPosY | number <double> Camera position Y coordinate. |
| camPosZ | number <double> Camera position Z coordinate. |
| camTarX | number <double> Camera target X coordinate. |
| camTarY | number <double> Camera target Y coordinate. |
| camTarZ | number <double> Camera target Z coordinate. |
| defectTitle | string Title used when the callout's type is 'Defect'. |
| defectDescription | string Defect description |
| defectSeverity | integer or null Numeric value indicating the severity of the defect. One of 1–5, or null when unclassified. The values correspond to the labels shown in the app: null = Unclassified, 1 = Low, 2 = Normal, 3 = Medium, 4 = High, 5 = Critical. |
| defectType | Array of strings The callout's list of tags, shown as "Observation Tags" in the app. Despite the field name, tags are supported on all callout types, not just Defects. In the app's Layers panel, callouts can be grouped and filtered by these tags, and each tag becomes an autocomplete suggestion for future tagging across the organization. |
| measurementClosed | boolean Indicates whether the polyline forms a closed shape. Measurement / polyline callouts only. |
| measurementLength | number <double> The sum of the lengths of all segments of the polyline. Measurement / polyline callouts only. Nira computes this from the callout's points and uses it for display, such as measurement labels in the orthophoto viewer and the defect dialog. It is ignored on import, and is recomputed the next time the asset is opened. |
| measurementArea | number <double> The area enclosed by the polyline. Closed measurement / polyline callouts only. Nira computes this from the callout's points as a triangulated surface area, so it follows the geometry rather than flattening it. It is ignored on import, and is recomputed the next time the asset is opened. |
| points | Array of numbers[ items <double >[ items <double > = 3 items ] ] An array of ordered 3D points comprising the polyline. Measurement /
polyline callouts only. When
|
| coordsys | string The coordinate system used for the callout's 3D positional data
( On export, the value is set from the export request's Axis order for EPSG:4326: X values ( |
| viewColorR | number <float> [ 0 .. 255 ] The red component of the callout's display color, in the range 0-255 (not 0.0-1.0). |
| viewColorG | number <float> [ 0 .. 255 ] The green component of the callout's display color, in the range 0-255. |
| viewColorB | number <float> [ 0 .. 255 ] The blue component of the callout's display color, in the range 0-255. |
| showDescriptionInView | boolean Default: true For CameraBookmark callouts, controls whether the callout's |
Array of objects A list of photo callouts associated with this callout. Currently, only
one photo callout per callout is supported, and they are only
applicable to callouts of type Defect. The
| |
| pdfReportScreenshotId | string <uuid> Unique identifier of the screenshot image shown for this defect callout in PDF reports. Presence of this attribute implies that this callout was configured to be shown in PDF reports. This attribute is only effective when imported into the same Nira organization from which it was exported. |
{- "uuid": "9f8e7d6c-5b4a-4392-8171-0e2d3c4b5a69",
- "numericId": 1,
- "alphanumericId": "A1",
- "title": "North pier, west face",
- "poiDescription": "Hairline crack running the full height of the pier.",
- "externalId": "inspection-2026-0042",
- "content": [
- {
- "type": "p",
- "children": [
- {
- "text": "Inspect the corroded flange."
}
]
}
], - "type": "Defect",
- "schemaVersion": 2,
- "posX": -84.268241,
- "posY": 39.344056,
- "posZ": 211.843078,
- "camPosX": -84.267912,
- "camPosY": 39.343688,
- "camPosZ": 238.512443,
- "camTarX": -84.268241,
- "camTarY": 39.344056,
- "camTarZ": 211.843078,
- "defectTitle": "Spalling at pier base",
- "defectDescription": "Concrete spalling with exposed rebar, roughly 40 cm across.",
- "defectSeverity": 4,
- "defectType": [
- "Corrosion",
- "Spalling"
], - "measurementClosed": false,
- "measurementLength": 0.8870510458946228,
- "measurementArea": 0,
- "points": [
- [
- -84.268241,
- 39.344056,
- 211.843078
], - [
- -84.268236,
- 39.344062,
- 212.239078
]
], - "coordsys": "EPSG:4326",
- "viewColorR": 255,
- "viewColorG": 191,
- "viewColorB": 0,
- "showDescriptionInView": true,
- "photocallouts": [
- {
- "filename": "P0002105.jpg",
- "top": 4026,
- "left": 5076,
- "width": 441,
- "height": 619,
}
], - "pdfReportScreenshotId": "3f2504e0-4f89-41d3-9a0c-0305e82c3301"
}Import callouts for a specific asset
Imports callouts onto an asset from a JSON, CSV, or TSV payload. The
payload format must match the Content-Type header: application/json,
text/csv, or text/tab-separated-values.
For JSON, the request body is an array of Callout objects, the same format the export endpoint produces, so an exported file is accepted as-is. See the Callout schema for the full field reference, including the CSV/TSV column encodings.
The mode query parameter selects what the import does. In the default
add mode every row becomes a new callout: any uuid or
numericId or alphanumericId in the payload is ignored. Nira
assigns all of them.
In replace mode every callout on the asset is removed first,
including photo callouts, and then every row in the request is created.
In update mode no callouts are created. Each row is matched against
an existing callout on the asset by the field named in matchField
(uuid or externalId), and matched callouts are updated in place
with only the fields the row actually carries. Rows that match nothing
are skipped and reported as such in the response. On import all fields
are optional.
externalId is a caller-owned identifier that Nira stores and returns
but never generates. In CSV/TSV an empty externalId cell leaves the
stored value unchanged, the same as every other omitted column. In JSON
a null clears it.
A malformed match value rejects the whole request with a 400. A well-formed one that matches nothing only skips that row.
This endpoint requires the organization to be on the Growth or Enterprise plan.
A request either applies in full or changes nothing. If it returns an
error status, nothing was written, including any callouts
mode=replace had already removed, so a failed
request is safe to retry once the payload is corrected.
What each response status means:
- 2xx: the import applied.
- 4xx or 556: the request was rejected and will be rejected again if resent unchanged. Correct it before sending it again.
- 401: refresh the credentials once, then retry.
- 429: wait for the time in the
Retry-Afterheader, then retry. - 500, 502, 503, or 52x: retry as it stands.
- 504 or 524: retry only when the original request carried an
Idempotency-Key, because the import may already have applied.
Every error body carries a stable reason string on each entry of
errors, such as import-over-limit, so clients can branch on that
instead of on the message text.
To make a retry safe after a timeout or a lost connection, send an
Idempotency-Key header and repeat the same key on the retry. If the
first attempt did apply, the retry returns that attempt's original
response and imports nothing further.
A single request accepts at most 60000 callouts. Larger imports must be split into several requests. Each one is atomic on its own, so send them one at a time and check each response before sending the next.
Body size limits are 40 MB for JSON and 100 MB for CSV/TSV.
Authorizations:
path Parameters
| asset_suuid required | string The 22-character asset short UUID, as it appears in the asset's URL in the Nira app. Numeric asset ids are not accepted. |
query Parameters
| mode | string Default: "add" Enum: "add" "replace" "update" What the import does:
|
| matchField | string Enum: "uuid" "externalId" The callout field used to match payload rows to existing callouts. Required when mode=update, and ignored in the other modes. In update mode every row must carry a value for it, and no two rows may repeat a value.
|
| removeCalloutsBeforeImport | string Default: "0" Enum: "1" "0" Deprecated. "1" is equivalent to mode=replace, and is kept for
callers that already send it. Defaults to "0". Cannot be combined
with |
header Parameters
| x-api-key required | string Your API key |
| Content-Type required | string Enum: "application/json" "text/csv" "text/tab-separated-values" The content type of the request body. Must be one of 'application/json', 'text/csv', or 'text/tab-separated-values'. |
| Idempotency-Key | string An optional identifier you choose for this import, 1 to 200 characters. Repeating a request with the same key on the same asset returns the original response and imports nothing further. Using a key that was already used for a different request on the same asset returns a 409. |
Request Body schema: required
| uuid | string <uuid> Nira's unique identifier for the callout. Always present in exported callouts. When importing callouts:
|
| title | string Title for Annotation and Camera Bookmarks. Also see defectTitle parameter. |
| poiDescription | string Description text for CameraBookmark callouts. This is the text box shown in the 3D view next to the callout. Whether the box is displayed is controlled by |
| externalId | string <= 255 characters Your own identifier for the callout, up to 255 characters, unique among the live callouts of an asset. Nira stores and returns it but never generates one. Returned in every export, empty when unset. When importing callouts:
|
| content | Array of objects Rich-text body content for Annotation callouts, produced by Nira's
Slate-based editor. It is an array of block nodes, each of the form
|
| type | string Default: "CameraBookmark" Enum: "Annotation" "Defect" "Measurement" "CameraBookmark" Specifies the type of callout. Measurement callouts are also referred
to as Polyline Callouts. These values correspond to the Callout Type
labels shown in the Nira app as follows: |
| schemaVersion | integer The version of the callout data format. Always specify 2. Version 1, or omitting this field, is a legacy format and should not be used. |
| posX | number <double> X coordinate for point callouts. When |
| posY | number <double> Y coordinate for point callouts. When |
| posZ | number <double> Z coordinate for point callouts. Elevation is always expressed in the coordinate system of the asset's source geometry files (e.g. meters if the source files use meters). It is not converted between vertical datums. |
| camPosX | number <double> Camera position X coordinate. |
| camPosY | number <double> Camera position Y coordinate. |
| camPosZ | number <double> Camera position Z coordinate. |
| camTarX | number <double> Camera target X coordinate. |
| camTarY | number <double> Camera target Y coordinate. |
| camTarZ | number <double> Camera target Z coordinate. |
| defectTitle | string Title used when the callout's type is 'Defect'. |
| defectDescription | string Defect description |
| defectSeverity | integer or null Numeric value indicating the severity of the defect. One of 1–5, or null when unclassified. The values correspond to the labels shown in the app: null = Unclassified, 1 = Low, 2 = Normal, 3 = Medium, 4 = High, 5 = Critical. |
| defectType | Array of strings The callout's list of tags, shown as "Observation Tags" in the app. Despite the field name, tags are supported on all callout types, not just Defects. In the app's Layers panel, callouts can be grouped and filtered by these tags, and each tag becomes an autocomplete suggestion for future tagging across the organization. |
| measurementClosed | boolean Indicates whether the polyline forms a closed shape. Measurement / polyline callouts only. |
| points | Array of numbers[ items <double >[ items <double > = 3 items ] ] An array of ordered 3D points comprising the polyline. Measurement /
polyline callouts only. When
|
| coordsys | string The coordinate system used for the callout's 3D positional data
( On export, the value is set from the export request's Axis order for EPSG:4326: X values ( |
| viewColorR | number <float> [ 0 .. 255 ] The red component of the callout's display color, in the range 0-255 (not 0.0-1.0). |
| viewColorG | number <float> [ 0 .. 255 ] The green component of the callout's display color, in the range 0-255. |
| viewColorB | number <float> [ 0 .. 255 ] The blue component of the callout's display color, in the range 0-255. |
| showDescriptionInView | boolean Default: true For CameraBookmark callouts, controls whether the callout's |
Array of objects A list of photo callouts associated with this callout. Currently, only
one photo callout per callout is supported, and they are only
applicable to callouts of type Defect. The
| |
| pdfReportScreenshotId | string <uuid> Unique identifier of the screenshot image shown for this defect callout in PDF reports. Presence of this attribute implies that this callout was configured to be shown in PDF reports. This attribute is only effective when imported into the same Nira organization from which it was exported. |
Responses
Request samples
- Payload
[- {
- "uuid": "9f8e7d6c-5b4a-4392-8171-0e2d3c4b5a69",
- "title": "North pier, west face",
- "poiDescription": "Hairline crack running the full height of the pier.",
- "externalId": "inspection-2026-0042",
- "content": [
- {
- "type": "p",
- "children": [
- {
- "text": "Inspect the corroded flange."
}
]
}
], - "type": "Defect",
- "schemaVersion": 2,
- "posX": -84.268241,
- "posY": 39.344056,
- "posZ": 211.843078,
- "camPosX": -84.267912,
- "camPosY": 39.343688,
- "camPosZ": 238.512443,
- "camTarX": -84.268241,
- "camTarY": 39.344056,
- "camTarZ": 211.843078,
- "defectTitle": "Spalling at pier base",
- "defectDescription": "Concrete spalling with exposed rebar, roughly 40 cm across.",
- "defectSeverity": 4,
- "defectType": [
- "Corrosion",
- "Spalling"
], - "measurementClosed": false,
- "points": [
- [
- -84.268241,
- 39.344056,
- 211.843078
], - [
- -84.268236,
- 39.344062,
- 212.239078
]
], - "coordsys": "EPSG:4326",
- "viewColorR": 255,
- "viewColorG": 191,
- "viewColorB": 0,
- "showDescriptionInView": true,
- "photocallouts": [
- {
- "filename": "P0002105.jpg",
- "top": 4026,
- "left": 5076,
- "width": 441,
- "height": 619
}
], - "pdfReportScreenshotId": "3f2504e0-4f89-41d3-9a0c-0305e82c3301"
}
]Response samples
- 200
{- "assetId": 4213,
- "suuid": "FmITrR_IR1KIsfhXJireEQ",
- "mode": "add",
- "matchField": null,
- "removeCalloutsBeforeImport": true,
- "removedCount": 0,
- "createdCount": 2,
- "updatedCount": 0,
- "skippedCount": 0,
- "results": [
- {
- "outcome": "created",
- "uuid": "9f8e7d6c-5b4a-4392-8171-0e2d3c4b5a69"
}
]
}Export callouts for a specific asset
Exports callouts related to the specified asset in the requested format.
What each response status means:
- 2xx: the export is complete.
- 4xx or 556: the request was rejected and will be rejected again if resent unchanged. Correct it before sending it again.
- 401: refresh the credentials once, then retry.
- 429: wait for the time in the
Retry-Afterheader, then retry. - 500, 502, 503, or 52x: retry as it stands.
Every error body carries a stable reason string on each entry of
errors, such as export-invalid-coordsys, so clients can branch on that
instead of on the message text.
Authorizations:
path Parameters
| asset_suuid required | string The unique identifier of the asset. |
query Parameters
| format | string Default: "json" Enum: "json" "csv" "tsv" The format of the export. One of 'json', 'csv', or 'tsv'. Defaults to 'json' when omitted. |
| coordsys | string Enum: "local" "asset" "latlong" The coordinate system that will be used for the exported callouts 3D positional data (
|
| include | Array of strings Default: "pointCallouts,polylineCallouts,photoCallouts,pdfReportScreenshotIds" Items Enum: "pointCallouts" "polylineCallouts" "photoCallouts" "pdfReportScreenshotIds" Selects which categories of callout data to include in the export. When omitted, all categories are included. When provided, only the listed categories are included, and any category not listed is excluded. Values are matched case-insensitively.
|
header Parameters
| x-api-key required | string Your API key |
Responses
Response samples
- 200
[- {
- "uuid": "9f8e7d6c-5b4a-4392-8171-0e2d3c4b5a69",
- "numericId": 1,
- "alphanumericId": "A1",
- "title": "North pier, west face",
- "poiDescription": "Hairline crack running the full height of the pier.",
- "externalId": "inspection-2026-0042",
- "content": [
- {
- "type": "p",
- "children": [
- {
- "text": "Inspect the corroded flange."
}
]
}
], - "type": "Defect",
- "schemaVersion": 2,
- "posX": -84.268241,
- "posY": 39.344056,
- "posZ": 211.843078,
- "camPosX": -84.267912,
- "camPosY": 39.343688,
- "camPosZ": 238.512443,
- "camTarX": -84.268241,
- "camTarY": 39.344056,
- "camTarZ": 211.843078,
- "defectTitle": "Spalling at pier base",
- "defectDescription": "Concrete spalling with exposed rebar, roughly 40 cm across.",
- "defectSeverity": 4,
- "defectType": [
- "Corrosion",
- "Spalling"
], - "measurementClosed": false,
- "measurementLength": 0.8870510458946228,
- "measurementArea": 0,
- "points": [
- [
- -84.268241,
- 39.344056,
- 211.843078
], - [
- -84.268236,
- 39.344062,
- 212.239078
]
], - "coordsys": "EPSG:4326",
- "viewColorR": 255,
- "viewColorG": 191,
- "viewColorB": 0,
- "showDescriptionInView": true,
- "photocallouts": [
- {
- "filename": "P0002105.jpg",
- "top": 4026,
- "left": 5076,
- "width": 441,
- "height": 619,
}
], - "pdfReportScreenshotId": "3f2504e0-4f89-41d3-9a0c-0305e82c3301"
}
]Delete an asset
Authorizations:
path Parameters
| suuid required | string Assets's base64 encoded uuid |
header Parameters
| x-api-key required | string Your API key |
Responses
Response samples
- 200
{- "success": true,
- "result": {
- "id": 4213,
- "name": "Kings Island Bridge Survey",
- "uuid": "140d1779-2bb4-4443-bc25-ab8c6f43bc1b",
- "createdBy": 17,
- "usesvt": false,
- "type": "photogrammetry",
- "passwordRequired": false,
- "dccname": "RealityScan",
- "hideBranding": false
}
}Change an asset's visibility
This controls whether an asset is publicly accessible or private.
Authorizations:
path Parameters
| suuid required | string Assets's base64 encoded uuid |
header Parameters
| x-api-key required | string Your API key |
Request Body schema: application/jsonrequired
| visibility | string Enum: "private" "publicly_accessible" |
Responses
Request samples
- Payload
{- "visibility": "private"
}Response samples
- 200
{- "success": true,
- "result": {
- "id": 4213,
- "name": "Kings Island Bridge Survey",
- "uuid": "140d1779-2bb4-4443-bc25-ab8c6f43bc1b",
- "createdBy": 17,
- "usesvt": false,
- "type": "photogrammetry",
- "passwordRequired": false,
- "dccname": "RealityScan",
- "hideBranding": false
}
}Delete multiple assets
Delete multiple assets that were created prior to a particular point in time. This can be useful for cleaning up older assets.
Authorizations:
query Parameters
| before required | string^\d+d?$ Example: before=30d A timestamp (milliseconds since epoch) or a relative date string in the format "Nd", where N is a positive integer and "d" represents days. For example, "30d" would delete assets created before 30 days ago, and the timestamp "1741201439963" would delete all assets created before 2025-03-05 19:03:59 UTC. |
| confirm required | string^(true|false)$ Example: confirm=true If param is set to 'true', the deletion will be executed. |
header Parameters
| x-api-key required | string Your API key |
Responses
Response samples
- 200
{- "success": true,
- "result": [
- {
- "id": 1,
- "uuid": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Asset"
}
]
}Expire all of a user's sessions
Expire all of the login sessions of a user account with the specified email address. Please note, it can take up to 10 minutes after making this request for the user to be forcibly logged out of an ongoing session.
Authorizations:
query Parameters
| email required | string Example: email=example@gmail.com |
header Parameters
| x-api-key required | string Your API key |
Responses
Response samples
- 200
- 404
{- "success": true,
- "result": [
- {
- "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
- "email": "user@example.com",
- "iat": 0,
- "exp": 0
}
]
}