API Reference
Complete API documentation for developers extending the migration tool.
Table of contents
- Overview
 - Authentication
 - Migration Steps API
 - Migration Operations
 - Validation API
 - Orchestration API
 - Image Transfer API
 - Extension Analysis API
 - System Information API
 - Logs API
 - Error Responses
 - Rate Limiting
 - Webhooks
 - SDK & Client Libraries
 - Best Practices
 - Need Help?
 
Overview
The OpenCart Migration Tool provides a RESTful API for programmatic access to migration functionality. This allows integration with external systems, automation, and custom workflows.
API endpoints require authentication. Use session-based auth or provide credentials.
Authentication
Session-Based Authentication
// Login endpoint
POST /login
// Request body
{
    "username": "admin",
    "password": "your_password"
}
// Response
{
    "success": true,
    "user": {
        "id": 1,
        "username": "admin"
    },
    "session_id": "abc123..."
}
API Headers
POST /api/migrate
Content-Type: application/json
Cookie: PHPSESSID=abc123...
Migration Steps API
Get All Steps
Retrieve list of all migration steps with status.
GET /api/steps
Response:
{
    "success": true,
    "steps": [
        {
            "step_id": "default_data",
            "name": "Default Data Migration",
            "category": "core",
            "status": "completed",
            "source_count": 10,
            "target_count": 10,
            "last_run": "2025-10-09 10:30:00"
        },
        {
            "step_id": "categories",
            "name": "Categories Migration",
            "category": "core",
            "status": "pending",
            "source_count": 258,
            "target_count": 0,
            "last_run": null
        }
    ]
}
Get Step Details
GET /api/steps/{step_id}
Response:
{
    "success": true,
    "step": {
        "step_id": "products",
        "name": "Products Migration",
        "description": "Migrate product data with images and variants",
        "category": "core",
        "status": "in_progress",
        "depends_on": ["default_data", "categories", "manufacturers"],
        "progress": {
            "total": 5000,
            "processed": 2500,
            "success": 2450,
            "failed": 50,
            "percentage": 50
        },
        "statistics": {
            "source_count": 5000,
            "target_count": 2450,
            "validation_passed": true
        }
    }
}
Migration Operations
Start Migration
Initiate migration for a specific step.
POST /api/migrate/{step_id}
Content-Type: application/json
{
    "batch_size": 1000,
    "skip_validation": false,
    "options": {
        "include_images": true
    }
}
Response:
{
    "success": true,
    "message": "Migration started successfully",
    "job_id": "migration_products_20251009_103000",
    "status": "running"
}
Check Migration Progress
GET /api/migrate/{step_id}/progress
Response:
{
    "success": true,
    "status": "running",
    "progress": {
        "current": 2500,
        "total": 5000,
        "percentage": 50,
        "records_per_second": 45,
        "estimated_time_remaining": "2 minutes"
    },
    "statistics": {
        "success_count": 2450,
        "error_count": 50,
        "skipped_count": 0
    }
}
Stop Migration
POST /api/migrate/{step_id}/stop
Response:
{
    "success": true,
    "message": "Migration stopped",
    "final_statistics": {
        "processed": 2500,
        "success": 2450,
        "failed": 50
    }
}
Reset Migration Step
POST /api/migrate/{step_id}/reset
Response:
{
    "success": true,
    "message": "Migration step reset successfully",
    "step_id": "products",
    "new_status": "pending"
}
Validation API
Validate Step
Run validation for a migration step.
POST /api/validate/{step_id}
Response:
{
    "success": true,
    "validation": {
        "passed": false,
        "errors": [
            {
                "type": "count_mismatch",
                "message": "Source count (5000) != Target count (4950)",
                "severity": "high"
            }
        ],
        "warnings": [
            {
                "type": "missing_images",
                "message": "50 products missing images",
                "severity": "medium"
            }
        ]
    }
}
Get Validation Report
GET /api/validate/{step_id}/report
Response:
{
    "success": true,
    "report": {
        "step_id": "products",
        "validation_date": "2025-10-09 11:00:00",
        "overall_status": "passed",
        "checks": [
            {
                "name": "Record Count",
                "status": "passed",
                "source_count": 5000,
                "target_count": 5000
            },
            {
                "name": "Data Integrity",
                "status": "passed",
                "details": "All foreign keys valid"
            },
            {
                "name": "Image Validation",
                "status": "warning",
                "details": "50 images missing"
            }
        ]
    }
}
Orchestration API
Start Full Migration
Execute complete migration pipeline.
POST /api/orchestrator/start
Content-Type: application/json
{
    "steps": ["default_data", "categories", "products"],
    "batch_size": 1000,
    "stop_on_error": true
}
Response:
{
    "success": true,
    "orchestration_id": "orch_20251009_103000",
    "status": "running",
    "current_step": "default_data",
    "total_steps": 3
}
Get Orchestration Status
GET /api/orchestrator/status/{orchestration_id}
Response:
{
    "success": true,
    "orchestration": {
        "id": "orch_20251009_103000",
        "status": "running",
        "started_at": "2025-10-09 10:30:00",
        "current_step": "categories",
        "completed_steps": ["default_data"],
        "remaining_steps": ["products"],
        "progress": {
            "current": 1,
            "total": 3,
            "percentage": 33
        }
    }
}
Image Transfer API
Transfer Images
Manually trigger image transfer.
POST /api/images/transfer
Content-Type: application/json
{
    "type": "products",  // products, categories, manufacturers
    "force": false,  // Overwrite existing files
    "validate": true  // Validate after transfer
}
Response:
{
    "success": true,
    "transfer": {
        "total_files": 5000,
        "transferred": 4950,
        "skipped": 50,
        "failed": 0,
        "total_size": "2.5 GB"
    }
}
Verify Images
POST /api/images/verify
Content-Type: application/json
{
    "type": "products"
}
Response:
{
    "success": true,
    "verification": {
        "total": 5000,
        "valid": 4950,
        "missing": 50,
        "corrupted": 0,
        "issues": [
            {
                "file": "product-123.jpg",
                "issue": "File not found",
                "product_id": 123
            }
        ]
    }
}
Extension Analysis API
Analyze Extensions
Get compatibility analysis for installed extensions.
GET /api/extensions/analyze
Response:
{
    "success": true,
    "analysis": {
        "total_extensions": 83,
        "compatible": 21,
        "missing": 62,
        "categories": {
            "payment": {
                "total": 15,
                "compatible": 10,
                "missing": 5
            },
            "shipping": {
                "total": 8,
                "compatible": 6,
                "missing": 2
            }
        },
        "extensions": [
            {
                "code": "paypal",
                "type": "payment",
                "oc3_installed": true,
                "oc4_available": true,
                "compatibility": "compatible"
            }
        ]
    }
}
System Information API
Get System Info
GET /api/system/info
Response:
{
    "success": true,
    "system": {
        "version": "1.0.0",
        "php_version": "8.1.2",
        "mysql_version": "8.0.32",
        "memory_limit": "512M",
        "max_execution_time": 3600,
        "databases": {
            "source": {
                "connected": true,
                "database": "opencart3_db",
                "tables": 145
            },
            "target": {
                "connected": true,
                "database": "opencart4_db",
                "tables": 150
            }
        }
    }
}
Health Check
GET /api/health
Response:
{
    "success": true,
    "status": "healthy",
    "checks": {
        "database_source": "ok",
        "database_target": "ok",
        "filesystem": "ok",
        "memory": "ok"
    }
}
Logs API
Get Recent Logs
GET /api/logs?level=error&limit=100
Response:
{
    "success": true,
    "logs": [
        {
            "timestamp": "2025-10-09 10:35:22",
            "level": "ERROR",
            "message": "Failed to migrate product #123",
            "context": {
                "step": "products",
                "product_id": 123,
                "error": "Foreign key constraint failed"
            }
        }
    ],
    "pagination": {
        "current_page": 1,
        "total_pages": 5,
        "total_logs": 450
    }
}
Error Responses
Standard Error Format
{
    "success": false,
    "error": {
        "code": "MIGRATION_FAILED",
        "message": "Products migration failed",
        "details": "Foreign key constraint violation",
        "step_id": "products"
    }
}
Common Error Codes
| Code | Description | HTTP Status | 
|---|---|---|
AUTH_FAILED | 
      Authentication failed | 401 | 
INVALID_STEP | 
      Step ID not found | 404 | 
MIGRATION_FAILED | 
      Migration operation failed | 500 | 
VALIDATION_ERROR | 
      Data validation failed | 400 | 
DATABASE_ERROR | 
      Database connection/query error | 500 | 
PERMISSION_DENIED | 
      Insufficient permissions | 403 | 
Rate Limiting
API requests are limited to prevent abuse:
- Public endpoints: 60 requests/minute
 - Authenticated endpoints: 300 requests/minute
 - Migration operations: 10 concurrent operations
 
Rate limit headers:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 250
X-RateLimit-Reset: 1696856400
Webhooks
Configure Webhooks
Register webhook URLs to receive migration events.
POST /api/webhooks
Content-Type: application/json
{
    "url": "https://your-server.com/webhook",
    "events": ["migration.completed", "migration.failed"],
    "secret": "your_webhook_secret"
}
Webhook Events
Migration Completed:
{
    "event": "migration.completed",
    "timestamp": "2025-10-09 11:00:00",
    "data": {
        "step_id": "products",
        "status": "completed",
        "statistics": {
            "processed": 5000,
            "success": 4950,
            "failed": 50
        }
    }
}
Migration Failed:
{
    "event": "migration.failed",
    "timestamp": "2025-10-09 11:00:00",
    "data": {
        "step_id": "products",
        "error": "Database connection lost",
        "partial_progress": {
            "processed": 2500,
            "success": 2450
        }
    }
}
SDK & Client Libraries
PHP Client
use MigrationTool\Client;
$client = new Client([
    'base_url' => 'http://migration-tool.local',
    'username' => 'admin',
    'password' => 'password'
]);
// Start migration
$response = $client->migrateStep('products', [
    'batch_size' => 1000
]);
// Check progress
$progress = $client->getProgress('products');
echo "Progress: {$progress['percentage']}%";
JavaScript Client
const MigrationClient = require('@migration-tool/client');
const client = new MigrationClient({
    baseUrl: 'http://migration-tool.local',
    credentials: {
        username: 'admin',
        password: 'password'
    }
});
// Start migration
await client.migrateStep('products', {
    batchSize: 1000
});
// Monitor progress
const progress = await client.getProgress('products');
console.log(`Progress: ${progress.percentage}%`);
Best Practices
API Usage
- ✅ Use authentication for all requests
 - ✅ Handle rate limiting gracefully
 - ✅ Implement exponential backoff for retries
 - ✅ Monitor long-running operations
 - ✅ Validate webhook signatures
 
Error Handling
try {
    await client.migrateStep('products');
} catch (error) {
    if (error.code === 'RATE_LIMIT_EXCEEDED') {
        // Wait and retry
        await sleep(error.retryAfter * 1000);
        await client.migrateStep('products');
    } else {
        // Log and handle other errors
        console.error('Migration failed:', error.message);
    }
}