Skip to main content
MainWP registers 30 site management abilities into the WordPress Abilities API framework. These enable programmatic control over your WordPress network through standardized schemas.

What You’ll Learn

  • Listing, filtering, and retrieving site information
  • Adding, updating, and deleting sites
  • Managing site connectivity (sync, reconnect, disconnect, suspend)
  • Managing plugins and themes on individual sites
  • Retrieving security, change logs, and cost data

mainwp/list-sites-v1

List MainWP child sites with pagination and filtering. Method: GET (readonly)
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/list-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
pageintegerNo1Page number (1-based)
per_pageintegerNo20Items per page (1-100)
statusstringNo”any”Filter: any, connected, disconnected, suspended
searchstringNo""Search term for name or URL
client_idintegerNoFilter by client ID
tag_idintegerNoFilter by tag/group ID
Response:
{
  "items": [
    {
      "id": 1,
      "url": "https://site1.example.com",
      "name": "Site 1",
      "status": "connected",
      "client_id": 5
    }
  ],
  "page": 1,
  "per_page": 20,
  "total": 150
}

mainwp/get-site-v1

Get detailed information about a single site. Method: POST (requires input)
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"include_stats":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain/URL
include_statsbooleanNofalseInclude update counts and health score
Response:
{
  "id": 1,
  "url": "https://site1.example.com",
  "name": "Site 1",
  "status": "connected",
  "client_id": 5,
  "wp_version": "6.4.2",
  "php_version": "8.2.0",
  "last_sync": "2024-01-15T10:30:00Z",
  "admin_username": "admin",
  "child_version": "4.6.1",
  "notes": "Production site",
  "stats": {
    "plugin_updates": 3,
    "theme_updates": 1,
    "wp_update_available": false,
    "health_score": 85
  }
}

mainwp/sync-sites-v1

Trigger synchronization for one or more sites. Operations with more than 200 sites are queued for background processing. Method: POST
# Sync specific sites
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1, 2, 3]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/sync-sites-v1/run'

# Sync all sites (empty array)
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/sync-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_ids_or_domainsarrayNo[]Site IDs or domains. Empty = all sites
Response (Immediate - 200 sites or fewer):
{
  "queued": false,
  "synced": [
    {"id": 1, "url": "https://site1.example.com", "name": "Site 1"}
  ],
  "errors": [],
  "total_synced": 1,
  "total_errors": 0
}
Response (Queued - more than 200 sites):
{
  "queued": true,
  "job_id": "sync_abc123def456",
  "status_url": "https://your-dashboard.com/wp-json/mainwp/v2/jobs/sync_abc123def456",
  "sites_queued": 350
}

mainwp/add-site-v1

Add a new MainWP child site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"url":"https://newsite.example.com","admin":"admin","name":"New Site"}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/add-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
urlstringYesSite URL
adminstringYesAdmin username on child site
namestringNoDisplay name for the site
client_idintegerNoAssociate with a client
tagsarrayNoArray of tag IDs to assign
http_userstringNoHTTP Auth username
http_passstringNoHTTP Auth password
ssl_verifybooleanNotrueVerify SSL certificate
Response: Returns the created site object (same format as get-site-v1).

mainwp/update-site-v1

Update an existing site’s properties. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"name":"Updated Name","notes":"New notes"}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/update-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
namestringNoSite display name
notesstringNoSite notes
client_idintegerNoClient ID (null to unassign)
tagsarrayNoTag IDs (replaces existing)
Response: Returns the updated site object.

mainwp/delete-site-v1

Delete a site from MainWP. This is a destructive operation that requires confirmation. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/delete-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
confirmbooleanYesMust be true to confirm deletion
dry_runbooleanNofalsePreview without deleting
Response:
{
  "deleted": true,
  "site_id": 1,
  "site_url": "https://site1.example.com"
}

mainwp/reconnect-site-v1

Reconnect a single disconnected site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/reconnect-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "reconnected": true,
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "status": "connected"
}

mainwp/disconnect-site-v1

Disconnect a site. The site remains in the database but communication is disabled. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/disconnect-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "disconnected": true,
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "status": "disconnected"
}

mainwp/suspend-site-v1

Suspend a site. Suspended sites are excluded from sync and update operations. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/suspend-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "suspended": true,
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "status": "suspended"
}

mainwp/unsuspend-site-v1

Unsuspend a previously suspended site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/unsuspend-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "unsuspended": true,
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "status": "connected"
}

mainwp/check-site-v1

Check connectivity status of a single site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/check-site-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "reachable": true,
  "response_time_ms": 245,
  "http_status": 200
}

mainwp/get-site-plugins-v1

Get list of plugins installed on a child site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"status":"active"}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-plugins-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
statusstringNo”all”Filter: all, active, inactive
has_updatebooleanNoFilter to plugins with updates
Response:
{
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "plugins": [
    {
      "slug": "akismet/akismet.php",
      "name": "Akismet Anti-spam",
      "version": "5.3",
      "active": true,
      "update_version": "5.3.1"
    }
  ],
  "total": 15
}

mainwp/activate-site-plugins-v1

Activate plugins on a site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slugs":["akismet/akismet.php"]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/activate-site-plugins-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
slugsarrayYesPlugin slugs to activate
Response:
{
  "site_id": 1,
  "activated": ["akismet/akismet.php"],
  "errors": []
}

mainwp/deactivate-site-plugins-v1

Deactivate plugins on a site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slugs":["akismet/akismet.php"]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/deactivate-site-plugins-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
slugsarrayYesPlugin slugs to deactivate
Response:
{
  "site_id": 1,
  "deactivated": ["akismet/akismet.php"],
  "errors": []
}

mainwp/delete-site-plugins-v1

Delete plugins from a site. This is a destructive operation that requires confirmation. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slugs":["hello-dolly/hello.php"],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/delete-site-plugins-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
slugsarrayYesPlugin slugs to delete
confirmbooleanYesMust be true to confirm deletion
Response:
{
  "site_id": 1,
  "deleted": ["hello-dolly/hello.php"],
  "errors": []
}

mainwp/get-site-themes-v1

Get list of themes installed on a child site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-themes-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "active_theme": "twentytwentyfour",
  "themes": [
    {
      "slug": "twentytwentyfour",
      "name": "Twenty Twenty-Four",
      "version": "1.0",
      "active": true,
      "update_version": null
    }
  ],
  "total": 3
}

mainwp/activate-site-theme-v1

Activate a theme on a site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slug":"twentytwentyfour"}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/activate-site-theme-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
slugstringYesTheme slug to activate
Response:
{
  "site_id": 1,
  "activated": "twentytwentyfour",
  "previous_theme": "twentytwentythree"
}

mainwp/delete-site-themes-v1

Delete themes from a site. This is a destructive operation that requires confirmation. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"slugs":["twentytwenty"],"confirm":true}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/delete-site-themes-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
slugsarrayYesTheme slugs to delete
confirmbooleanYesMust be true to confirm deletion
Response:
{
  "site_id": 1,
  "deleted": ["twentytwenty"],
  "errors": []
}

mainwp/get-abandoned-plugins-v1

Get list of abandoned plugins across all sites. Abandoned plugins have not received updates in 2+ years. Method: GET (readonly)
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-abandoned-plugins-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
pageintegerNo1Page number
per_pageintegerNo50Items per page
Response:
{
  "items": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "slug": "old-plugin/old-plugin.php",
      "name": "Old Plugin",
      "version": "1.0.0",
      "last_updated": "2021-01-15"
    }
  ],
  "total": 5
}

mainwp/get-abandoned-themes-v1

Get list of abandoned themes across all sites. Method: GET (readonly)
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-abandoned-themes-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
pageintegerNo1Page number
per_pageintegerNo50Items per page
Response:
{
  "items": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "slug": "old-theme",
      "name": "Old Theme",
      "version": "1.0.0",
      "last_updated": "2020-06-01"
    }
  ],
  "total": 2
}

mainwp/get-site-security-v1

Get security information about a site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-security-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "site_id": 1,
  "site_url": "https://site1.example.com",
  "security_issues": [
    {
      "type": "file_permissions",
      "severity": "warning",
      "message": "wp-config.php is world-readable"
    }
  ],
  "ssl_status": {
    "valid": true,
    "expires": "2025-06-15"
  }
}

mainwp/get-site-changes-v1

Get change/activity log for a site. Requires the Logs module to be active. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1,"page":1,"per_page":50}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-changes-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
pageintegerNo1Page number
per_pageintegerNo50Items per page
Response:
{
  "site_id": 1,
  "changes": [
    {
      "id": 123,
      "type": "plugin_updated",
      "description": "Plugin 'Akismet' updated from 5.2 to 5.3",
      "user": "admin",
      "timestamp": "2024-01-15T10:30:00Z"
    }
  ],
  "total": 150
}
This ability requires the Logs module. If inactive, returns mainwp_module_not_available error.

mainwp/get-site-client-v1

Get the client associated with a site. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-client-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "site_id": 1,
  "client": {
    "id": 5,
    "name": "Acme Corp",
    "email": "[email protected]",
    "status": "active"
  }
}

mainwp/get-site-costs-v1

Get cost tracking data for a site. Requires the Cost Tracker module to be active. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_id_or_domain":1}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-costs-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_id_or_domaininteger|stringYesSite ID or domain
Response:
{
  "site_id": 1,
  "costs": [
    {
      "id": 1,
      "name": "Hosting",
      "amount": 29.99,
      "frequency": "monthly",
      "next_due": "2024-02-15"
    }
  ],
  "total_monthly": 29.99,
  "total_yearly": 359.88
}
This ability requires the Cost Tracker module. If inactive, returns mainwp_module_not_available error.

mainwp/count-sites-v1

Get total count of sites. Method: GET (readonly)
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/count-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
statusstringNo”any”Filter: any, connected, disconnected, suspended
Response:
{
  "total": 150
}

mainwp/get-sites-basic-v1

Get minimal site information (ID, URL, name only) for all sites. Method: GET (readonly)
curl -u 'admin:xxxx' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-sites-basic-v1/run'
Response:
{
  "sites": [
    {
      "id": 1,
      "url": "https://site1.example.com",
      "name": "Site 1"
    },
    {
      "id": 2,
      "url": "https://site2.example.com",
      "name": "Site 2"
    }
  ],
  "total": 150
}

mainwp/reconnect-sites-v1

Batch reconnect multiple disconnected sites. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1, 2, 3]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/reconnect-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_ids_or_domainsarrayNo[]Site IDs or domains. Empty = all disconnected sites
Response:
{
  "reconnected": [
    {"id": 1, "url": "https://site1.example.com"}
  ],
  "errors": [],
  "total_reconnected": 1,
  "total_errors": 0
}

mainwp/disconnect-sites-v1

Batch disconnect multiple sites. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1, 2, 3]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/disconnect-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_ids_or_domainsarrayYesSite IDs or domains
Response:
{
  "disconnected": [
    {"id": 1, "url": "https://site1.example.com"}
  ],
  "errors": [],
  "total_disconnected": 1,
  "total_errors": 0
}

mainwp/check-sites-v1

Batch connectivity check for multiple sites. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1, 2, 3]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/check-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_ids_or_domainsarrayNo[]Site IDs or domains. Empty = all sites
Response:
{
  "results": [
    {
      "site_id": 1,
      "site_url": "https://site1.example.com",
      "reachable": true,
      "response_time_ms": 245
    }
  ],
  "summary": {
    "total_checked": 3,
    "reachable": 2,
    "unreachable": 1
  }
}

mainwp/suspend-sites-v1

Batch suspend multiple sites. Method: POST
curl -X POST -u 'admin:xxxx' \
  -H 'Content-Type: application/json' \
  -d '{"input":{"site_ids_or_domains":[1, 2, 3]}}' \
  'https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/suspend-sites-v1/run'
Input Parameters:
NameTypeRequiredDefaultDescription
site_ids_or_domainsarrayYesSite IDs or domains
Response:
{
  "suspended": [
    {"id": 1, "url": "https://site1.example.com"}
  ],
  "errors": [],
  "total_suspended": 1,
  "total_errors": 0
}