Resourcly inventory API
The inventory API from Resourcly — 10 operation(s) for inventory.
The inventory API from Resourcly — 10 operation(s) for inventory.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/resourcly-inventory-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
description: API for document processing, item similarity search, and analytics.
title: Resourcly analytics Inventory API
termsOfService: https://resourcly.com/terms
contact:
name: API Support
email: support@resourcly.com
license:
name: Proprietary
version: 1.0.0
servers:
- url: https://api.resourcly.com/v1
tags:
- name: inventory
paths:
/inventory/aggregates:
get:
security:
- BearerAuth: []
description: Fetches aggregated statistics for a business node's inventory items.
tags:
- inventory
summary: Get ERP inventory aggregates
parameters:
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/models.ERPInventoryAggregatesResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/duplicates/{id}/{identifier}:
get:
security:
- BearerAuth: []
description: Retrieves all ERP inventory items that have the same primary identifier but a different ID
tags:
- inventory
summary: Get Duplicate ERP Inventory Items
parameters:
- description: ERP Inventory Item ID to exclude
name: id
in: path
required: true
schema:
type: string
- description: Primary Identifier to match
name: identifier
in: path
required: true
schema:
type: string
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/models.ERPInventoryItem'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/erp-items/by-identifier/{identifier}:
get:
security:
- BearerAuth: []
description: Retrieves all ERP inventory items by their primary identifier
tags:
- inventory
summary: Get ERP Inventory Items by primary_identifier
parameters:
- description: Primary Identifier
name: identifier
in: path
required: true
schema:
type: string
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/models.ERPInventoryItem'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/files:
get:
security:
- BearerAuth: []
description: Fetches a paginated list of inventory files for a business node.
tags:
- inventory
summary: List ERP inventory files
parameters:
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
- description: 'Page number (default: 1)'
name: page
in: query
schema:
type: integer
- description: 'Items per page (default: 20)'
name: page_size
in: query
schema:
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/models.ERPInventoryFileListResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/items:
get:
security:
- BearerAuth: []
description: Fetches a paginated list of inventory items for a business node, with optional file filter and search.
tags:
- inventory
summary: List ERP inventory items
parameters:
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
- description: Filter by ERP inventory file ID (UUID)
name: file_id
in: query
schema:
type: string
- description: Search by primary identifier, secondary identifier, or description
name: search
in: query
schema:
type: string
- description: 'Page number (default: 1)'
name: page
in: query
schema:
type: integer
- description: 'Items per page (default: 20)'
name: page_size
in: query
schema:
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/models.ERPInventoryItemListResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/items/by-identifier/{identifier}:
get:
security:
- BearerAuth: []
description: Retrieves an item by its primary identifier (part_number)
tags:
- inventory
summary: Get Item by primary_identifier
parameters:
- description: Primary Identifier (Part Number)
name: identifier
in: path
required: true
schema:
type: string
- description: Business node ID (leaf) the item is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/services.Item'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/items/part-number:
get:
security:
- BearerAuth: []
description: 'Retrieves ERP inventory items by their primary identifier (part_number).
Within the same part number, a single ERP entry may appear multiple
times linked to different item IDs. The caller is responsible for
checking each entry''s item ID to determine which item it belongs to.'
tags:
- inventory
summary: Get Items by primary_identifier
parameters:
- description: Primary identifiers (repeat the identifiers query parameter)
name: identifiers
in: query
required: true
style: form
explode: false
schema:
type: array
items:
type: string
- description: Optional business node ID (leaf) to scope the lookup; omit for a business-wide lookup
name: business_node_id
in: query
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/models.ERPInventoryItem'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/items/{id}:
get:
security:
- BearerAuth: []
description: Retrieves an ERP inventory item by its unique ID
tags:
- inventory
summary: Get ERP Inventory Item by ID
parameters:
- description: ERP Inventory Item ID
name: id
in: path
required: true
schema:
type: string
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/models.ERPInventoryItem'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/mapping/latest:
get:
security:
- BearerAuth: []
description: Fetches the column mapping from the most recently uploaded ERP inventory file for a business node.
tags:
- inventory
summary: Get most recent ERP inventory column mapping
parameters:
- description: Business node ID (leaf) the inventory is scoped to
name: business_node_id
in: query
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/models.InventoryUploadMapping'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
/inventory/upload:
post:
security:
- BearerAuth: []
description: Uploads an XLSX file with inventory. Saves file to bucket, logs an import job and erp_inventory_file row.
tags:
- inventory
summary: Upload ERP inventory XLSX
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/models.InventoryUploadResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/models.ErrorResponse'
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
description: XLSX file
format: binary
business_node_id:
type: string
description: Business node ID (leaf organizational unit) the inventory belongs to
primary_identifier_column:
type: string
description: Primary inventory identifier column header
secondary_identifier_column:
type: string
description: Secondary inventory identifier column header
description_columns:
type: array
items:
type: string
description: One or more description column headers (repeat the field)
primary_name:
type: string
description: Display name for the primary identifier
secondary_name:
type: string
description: Display name for the secondary identifier
description_names:
type: array
items:
type: string
description: One or more display names for description (repeat or comma-separated)
purchase_price_column:
type: string
description: Purchase price column header
purchase_quantity_column:
type: string
description: Purchase quantity column header
purchase_price_name:
type: string
description: Display name for the purchase price
purchase_quantity_name:
type: string
description: Display name for the purchase quantity
supplier_number_column:
type: string
description: Supplier number column header
supplier_name_column:
type: string
description: Supplier name column header
supplier_number_name:
type: string
description: Display name for the supplier number
supplier_name_name:
type: string
description: Display name for the supplier name
attributes:
type: string
description: 'JSON-encoded array of dynamic columns: [{source_column,label,type}]'
required:
- file
- business_node_id
- primary_identifier_column
components:
schemas:
services.Item:
type: object
properties:
additionalData: {}
businessID:
type: string
businessNodeID:
type: string
category:
type: string
createdAt:
type: string
duplicateConfidence:
type: number
duplicateGroupID:
type: string
duplicateStatus:
type: string
hasERPData:
type: boolean
id:
type: string
isPreferred:
type: boolean
manufacturer:
type: string
partNumber:
type: string
references:
type: array
items:
type: string
specifications: {}
title:
type: string
updatedAt:
type: string
models.ERPInventoryAggregatesResponse:
type: object
properties:
duplicate_primary_identifier_count:
type: integer
matched_primary_identifiers:
type: integer
total_records:
type: integer
total_unique_primary_identifiers:
type: integer
unconsolidated_count:
description: 'UnconsolidatedCount is the number of ERP records whose primary identifier
appears exactly once in the node (not shared with any other record). It is
the inverse of the "duplicates" set and is computed with the same
NOT-EXISTS predicate as the `unconsolidated` list filter so the count
matches the filtered row set.'
type: integer
unmatched_primary_identifiers:
type: integer
models.InventoryUploadMapping:
type: object
properties:
attributes:
description: 'Attributes carries every non-first-class column preserved from the upload
(dynamic import). Empty for legacy uploads made before dynamic mapping.'
type: array
items:
$ref: '#/components/schemas/models.ERPAttributeMapping'
description_columns:
type: array
items:
type: string
description_name:
type: string
primary_identifier_column:
type: string
primary_identifier_name:
description: Name fields for human-friendly display and llm
type: string
purchase_price_column:
type: string
purchase_price_name:
type: string
purchase_quantity_column:
type: string
purchase_quantity_name:
type: string
secondary_identifier_column:
type: string
secondary_identifier_name:
type: string
supplier_name_column:
type: string
supplier_name_name:
type: string
supplier_number_column:
type: string
supplier_number_name:
type: string
models.ERPInventoryItemListResponse:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/models.ERPInventoryItem'
total_count:
type: integer
models.ErrorResponse:
type: object
properties:
code:
type: string
details: {}
error:
type: string
models.ERPAttributeMapping:
type: object
properties:
label:
description: human-friendly display name (AI-suggested, user-editable)
type: string
source_column:
description: exact header text in the uploaded file == metadata key
type: string
type:
description: '"string" | "number" (display/format hint)'
type: string
models.InventoryUploadResponse:
type: object
properties:
bucket_url:
type: string
column_mapping:
$ref: '#/components/schemas/models.InventoryUploadMapping'
created_at:
type: string
id:
type: string
import_id:
type: string
ingested_count:
type: integer
item_count:
type: integer
models.ERPInventoryFileListResponse:
type: object
properties:
files:
type: array
items:
$ref: '#/components/schemas/models.ERPInventoryFile'
total_count:
type: integer
models.ERPInventoryItem:
type: object
properties:
created_at:
type: string
description_name:
type: string
erp_inventory_file_id:
type: string
erp_primary_identifier:
type: string
erp_secondary_identifier:
type: string
id:
type: string
is_preferred:
description: From the linked item (items.is_preferred), false when unmatched
type: boolean
item_id:
type: string
metadata: {}
purchase_price:
type: number
quantity:
type: number
supplier_name:
type: string
supplier_number:
type: string
models.ERPInventoryFile:
type: object
properties:
bucket_url:
type: string
business_id:
type: string
column_mapping:
$ref: '#/components/schemas/models.InventoryUploadMapping'
created_at:
type: string
extraction_error:
type: string
extraction_status:
type: string
filename:
type: string
id:
type: string
import_id:
type: string
ingested_count:
type: integer
item_count:
type: integer
status:
type: string
securitySchemes:
BearerAuth:
description: 'Firebase JWT token. Format: "Bearer {token}"'
type: apiKey
name: Authorization
in: header