Documentation / REST API

REST API

Integrate Tageur with your existing systems using our powerful REST API.

1. Overview

The Tageur REST API enables seamless integration with your existing business systems. Build custom integrations, automate workflows, and synchronize data between Tageur and your ERP, CMMS, or inventory management systems.

Common Integration Scenarios:

  • Sync assets from Microsoft Dynamics, SAP, or Odoo
  • Create maintenance tasks from external work order systems
  • Update parts inventory from procurement platforms
  • Export asset data to business intelligence tools
  • Automate asset lifecycle management

Base URL:

https://tageur.com/api

All API requests must use HTTPS. HTTP requests will be rejected.

2. Authentication

API authentication uses Bearer tokens. Generate an API key from your company settings page. Each API key is scoped to a specific company and has full access to that company's data.

Generating an API Key

  1. 1. Navigate to Company Settings → API Keys
  2. 2. Click "Create New API Key"
  3. 3. Enter a descriptive name (e.g., "Production ERP Integration")
  4. 4. Copy the generated key immediately (it won't be shown again)
  5. 5. Store it securely in your environment variables

Making Authenticated Requests

curl -X GET "https://tageur.com/api/assets" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

Security Best Practices:

  • Never commit API keys to version control
  • Use environment variables or secrets management services
  • Rotate API keys regularly
  • Create separate keys for different integrations
  • Revoke unused or compromised keys immediately

3. Assets API

Manage physical assets including equipment, vehicles, tools, and infrastructure.

GET /api/assets

List all assets with optional filtering and pagination.

Query Parameters:

status Filter by status (operational, maintenance, retired, etc.)
asset_type Filter by type (Equipment, Vehicle, Tool, etc.)
q Search by name, serial number, or model
page Page number (default: 1)
per_page Items per page (default: 50, max: 100)

Example Request:

curl -X GET "https://tageur.com/api/assets?status=operational&page=1&per_page=50" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example Response:

{
  "success": true,
  "data": {
    "assets": [
      {
        "id": 123,
        "name": "Excavator CAT 320",
        "asset_type": "Heavy Equipment",
        "status": "operational",
        "brand": "Caterpillar",
        "model_number": "320 GC",
        "serial_number": "CAT320GC2024001",
        "location": "Site A - Zone 3",
        "created_at": "2024-11-20T10:30:00Z",
        "updated_at": "2025-01-02T14:22:00Z"
      }
    ],
    "pagination": {
      "current_page": 1,
      "total_pages": 5,
      "total_count": 247,
      "per_page": 50
    }
  }
}
GET /api/assets/:id

Retrieve detailed information about a specific asset.

Example Response:

{
  "success": true,
  "data": {
    "asset": {
      "id": 123,
      "name": "Excavator CAT 320",
      "asset_type": "Heavy Equipment",
      "status": "operational",
      "serial_number": "CAT320GC2024001",
      "brand": "Caterpillar",
      "model_number": "320 GC",
      "location": "Site A - Zone 3",
      "company_office_location_id": 45,
      "company_office_location": {
        "id": 45,
        "name": "Main Warehouse",
        "city": "Chicago",
        "state": "IL",
        "is_primary": true
      },
      "latitude": 40.7128,
      "longitude": -74.0060,
      "purchase_date": "2024-11-15",
      "purchase_price": "250000.00",
      "warranty_duration_months": 36,
      "warranty_expiry_date": "2027-11-15",
      "maintenance_enabled": true,
      "maintenance_interval_days": 180,
      "maintenance_status": "current",
      "last_maintenance_date": "2024-12-01",
      "next_maintenance_date": "2025-05-30",
      "extra_values": {
        "department": "Construction",
        "cost_center": "CC-450"
      },
      "company_id": 456
    }
  }
}
POST /api/assets

Create a new asset.

Required Fields:

  • name - Asset name
  • asset_type - Type category
  • status - Current status

Example Request:

curl -X POST "https://tageur.com/api/assets" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "asset": {
      "name": "Forklift Toyota 8FG25",
      "asset_type": "Material Handling",
      "status": "operational",
      "brand": "Toyota",
      "model_number": "8FG25",
      "serial_number": "TY8FG2025001",
      "location": "Warehouse B",
      "company_office_location_id": 45,
      "purchase_date": "2025-01-03",
      "purchase_price": "28500.00",
      "extra_values": {
        "max_capacity": "5000 lbs",
        "fuel_type": "LPG"
      }
    }
  }'
PATCH /api/assets/:id

Update an existing asset. Only include fields you want to change.

curl -X PATCH "https://tageur.com/api/assets/123" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "asset": {
      "status": "maintenance",
      "location": "Maintenance Bay 2"
    }
  }'
POST /api/assets/sync

Bulk create or update assets. Matches by serial_number - creates new or updates existing.

curl -X POST "https://tageur.com/api/assets/sync" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "assets": [
      {
        "name": "Asset 1",
        "serial_number": "SN001",
        "asset_type": "Equipment",
        "status": "operational"
      },
      {
        "name": "Asset 2",
        "serial_number": "SN002",
        "asset_type": "Vehicle",
        "status": "operational"
      }
    ]
  }'

Response:

{
  "success": true,
  "message": "Sync completed: 15 created, 8 updated, 2 failed",
  "data": {
    "created": [
      { "id": 789, "serial_number": "SN015" }
    ],
    "updated": [
      { "id": 123, "serial_number": "SN002" }
    ],
    "failed": [
      {
        "serial_number": "SN099",
        "errors": ["Name can't be blank"]
      }
    ]
  }
}

4. Tasks API

Manage maintenance tasks, work orders, and scheduled activities.

GET /api/tasks

Query Parameters:

status pending, assigned, in_progress, completed, etc.
priority critical, urgent, high, normal, low
asset_id Filter by specific asset
assigned_to_id Filter by assigned user
due_before Tasks due before date (ISO 8601)
q Search title, description, notes
POST /api/tasks
curl -X POST "https://tageur.com/api/tasks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "task": {
      "title": "Monthly Hydraulic Fluid Check",
      "description": "Inspect and top up hydraulic fluid levels",
      "status": "pending",
      "priority": "high",
      "asset_id": 123,
      "due_date": "2025-02-01",
      "estimated_hours": 2
    }
  }'

Task Action Endpoints:

POST /api/tasks/:id/assign

Assign task to a user

POST /api/tasks/:id/start

Mark task as in progress

POST /api/tasks/:id/complete

Mark task as completed

POST /api/tasks/:id/comments

Add a comment to the task

5. Parts API

Manage spare parts inventory, suppliers, and usage tracking.

Available Endpoints:

GET /api/parts List all parts
GET /api/parts/:id Get part details
POST /api/parts Create new part
PATCH /api/parts/:id Update part
POST /api/parts/sync Bulk sync parts

6. Mobile App APIs

Complete API endpoints for mobile and web applications. All endpoints use JWT authentication via /api/auth/login.

Authentication (JWT)

POST /api/auth/login Login with email/password
POST /api/auth/register Register new user
GET /api/auth/me Get current user profile
POST /api/auth/refresh Refresh JWT token

Teams

Manage teams for task assignment and collaboration.

GET /api/teams List all teams
GET /api/teams/:id Get team with members
POST /api/teams Create team

Shipments

Growth+

Create and manage shipments, assign assets, track delivery, and perform bulk claims. Available on Growth and Enterprise plans.

GET /api/shipments List shipments (filter by ?status=)
GET /api/shipments/:id Get shipment with assets
POST /api/shipments Create shipment
PATCH /api/shipments/:id Update shipment details
DELETE /api/shipments/:id Delete shipment
POST /api/shipments/:id/add_asset Add asset to shipment { asset_id }
DELETE /api/shipments/:id/remove_asset Remove asset from shipment { asset_id }
POST /api/shipments/:id/mark_shipped Mark as shipped { tracking_number, carrier }
POST /api/shipments/:id/mark_delivered Mark as delivered
POST /api/shipments/:id/claim_all Bulk claim all assets { claimer_type, claimer_company_id }
POST /api/shipments/:id/verify_unlock Verify shipment password { unlock_code }

Company Members

View company members for task assignments.

GET /api/members List all members (with search)
GET /api/members/:id Get member details

Audit Trails

Track all changes to assets and tasks.

GET /api/assets/:id/audit_trail Get asset history
GET /api/tasks/:id/audit_trail Get task history

Document Signatures

Digital signatures for compliance documents.

GET /api/document_signatures List pending signatures
POST /api/document_signatures/:id/sign Sign document

7. ERP Sync Patterns

Tageur supports two complementary approaches for syncing data with external systems.

Bulk REST API Sync (Recommended for Initial Loads)

Best for batch operations, initial data migration, and periodic syncs.

Available Sync Endpoints:

POST /api/assets/sync Bulk sync assets by serial_number
POST /api/parts/sync Bulk sync parts by part_number
POST /api/tasks/sync Bulk sync tasks by external_id

When to Use:

  • Initial data migration from ERP systems
  • Nightly or periodic batch syncs
  • Manual sync operations
  • Systems without webhook support

Event-Based Webhooks (Real-Time Updates)

Best for real-time, event-driven updates from external systems.

Webhook Endpoint:

POST /api/webhooks/receive

Supported Events:

asset.created, asset.updated, asset.deleted
part.created, part.updated, part.deleted
task.created, task.updated, task.completed

When to Use:

  • Real-time sync from Dynamics 365, Odoo, SAP
  • Event-driven ERP integrations
  • Automated workflows triggered by external changes

8. Error Handling

The API uses standard HTTP response codes and returns detailed error messages in JSON format.

HTTP Status Codes:

200 Success
201 Resource created
400 Bad request - invalid parameters
401 Unauthorized - invalid or missing API key
404 Not found - resource doesn't exist
422 Validation failed
429 Rate limit exceeded
500 Server error

Error Response Format:

{
  "success": false,
  "error": "Validation Failed",
  "errors": [
    "Name can't be blank",
    "Serial number has already been taken"
  ]
}

9. Rate Limiting

API requests are rate-limited to ensure platform stability and fair usage.

Rate Limits:

  • Standard: 100 requests per minute
  • Burst: 200 requests per 5 minutes

Rate Limit Headers:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1735987200

Monitor these headers to avoid hitting rate limits.

10. Complete API Schemas

Detailed field descriptions for all API resources.

Asset Schema

Field Type Required Description
id integer - Unique identifier (read-only)
name string Asset name
asset_type string Type category (Equipment, Vehicle, Tool, etc.)
status string Current status (operational, maintenance, retired, etc.)
serial_number string Unique serial number or identifier
brand string Manufacturer brand
model_number string Model or part number
location string Specific location (e.g., room, shelf, zone)
company_office_location_id integer ID of assigned office location
company_office_location object - Nested office location details (read-only)
purchase_date date Date of purchase (YYYY-MM-DD)
purchase_price decimal Purchase cost
warranty_duration_months integer Warranty period in months
warranty_expiry_date date - Calculated warranty end date (read-only)
maintenance_enabled boolean Enable scheduled maintenance
maintenance_interval_days integer Days between maintenance cycles
extra_values object Custom fields (JSON object with any structure)
company_id integer - Owner company ID (read-only)
created_at datetime - Creation timestamp (read-only)
updated_at datetime - Last update timestamp (read-only)

Office Location Schema

Field Type Required Description
id integer - Unique identifier (read-only)
name string Location name
address string Street address
city string City name
state string State or province
country string Country name
postal_code string Postal or ZIP code
phone string Contact phone number
email string Contact email address
is_primary boolean Primary location flag
is_active boolean Active status
notes text Additional notes or instructions

11. Integration Examples

Sync Assets from ERP System

import requests
import os

TAGEUR_API_KEY = os.environ['TAGEUR_API_KEY']
BASE_URL = 'https://tageur.com/api'

headers = {
    'Authorization': f'Bearer {TAGEUR_API_KEY}',
    'Content-Type': 'application/json'
}

# Fetch assets from your ERP
erp_assets = get_assets_from_erp()

# Prepare bulk sync payload
sync_payload = {
    'assets': [
        {
            'name': asset['name'],
            'serial_number': asset['serial'],
            'asset_type': asset['category'],
            'status': 'operational',
            'purchase_date': asset['purchase_date'],
            'location': asset['location']
        }
        for asset in erp_assets
    ]
}

# Sync to Tageur
response = requests.post(
    f'{BASE_URL}/assets/sync',
    headers=headers,
    json=sync_payload
)

result = response.json()
print(f"Synced: {len(result['data']['created'])} created, {len(result['data']['updated'])} updated")

Create Maintenance Tasks from Work Orders

const axios = require('axios');

const tageurApi = axios.create({
  baseURL: 'https://tageur.com/api',
  headers: {
    'Authorization': `Bearer ${process.env.TAGEUR_API_KEY}`,
    'Content-Type': 'application/json'
  }
});

// Convert work order to Tageur task
async function createMaintenanceTask(workOrder) {
  const taskData = {
    task: {
      title: workOrder.description,
      priority: mapPriority(workOrder.urgency),
      status: 'pending',
      asset_id: workOrder.equipment_id,
      due_date: workOrder.scheduled_date,
      estimated_hours: workOrder.estimated_duration,
      description: workOrder.notes
    }
  };

  try {
    const response = await tageurApi.post('/tasks', taskData);
    console.log('Task created:', response.data.data.task.id);
    return response.data.data.task;
  } catch (error) {
    console.error('Error creating task:', error.response.data);
    throw error;
  }
}

Export Asset Data for Reporting

require 'httparty'
require 'csv'

class TageurExporter
  API_KEY = ENV['TAGEUR_API_KEY']
  BASE_URL = 'https://tageur.com/api'

  def export_assets_to_csv(filename)
    all_assets = fetch_all_assets

    CSV.open(filename, 'wb') do |csv|
      csv << ['ID', 'Name', 'Type', 'Status', 'Serial', 'Location', 'Last Maintenance']

      all_assets.each do |asset|
        csv << [
          asset['id'],
          asset['name'],
          asset['asset_type'],
          asset['status'],
          asset['serial_number'],
          asset['location'],
          asset['last_maintenance_date']
        ]
      end
    end

    puts "Exported #{all_assets.size} assets to #{filename}"
  end

  private

  def fetch_all_assets
    assets = []
    page = 1

    loop do
      response = HTTParty.get(
        "#{BASE_URL}/assets",
        headers: { 'Authorization' => "Bearer #{API_KEY}" },
        query: { page: page, per_page: 100 }
      )

      data = response.parsed_response['data']
      assets.concat(data['assets'])

      break if data['pagination']['current_page'] >= data['pagination']['total_pages']
      page += 1
    end

    assets
  end
end

# Usage
exporter = TageurExporter.new
exporter.export_assets_to_csv('assets_report.csv')