Resourcly inventory API

The inventory API from Resourcly — 10 operation(s) for inventory.

Operations 10

GET /inventory/aggregates Get ERP inventory aggregates
GET /inventory/duplicates/{id}/{identifier} Get Duplicate ERP Inventory Items
GET /inventory/erp-items/by-identifier/{identifier} Get ERP Inventory Items by primary_identifier
GET /inventory/files List ERP inventory files
GET /inventory/items List ERP inventory items
GET /inventory/items/by-identifier/{identifier} Get Item by primary_identifier
GET /inventory/items/part-number Get Items by primary_identifier
GET /inventory/items/{id} Get ERP Inventory Item by ID
GET /inventory/mapping/latest Get most recent ERP inventory column mapping
POST /inventory/upload Upload ERP inventory XLSX

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/resourcly-inventory-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

resourcly-inventory-api-openapi.yml Raw ↑
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