Version 2
The Extendify Analytics API allows authorized partners to access information about multiple sites on their service, with flexible filtering and pagination.
The current version is v2, and it should be included in the base URL of all requests:
https://insights.extendify.com/api/v2/
All endpoints require authorization.
Authorization: Bearer API_TOKEN
Ensure your API key is kept secure and not exposed in shared or public spaces.
Our API uses conventional HTTP response codes to indicate the success or failure of requests. Clients should handle each response appropriately. Common response codes include:
Code | Meaning |
---|---|
429 | Too Many Requests |
500 | Internal Server Error |
401 | Unauthorized |
400 | Bad Request |
In each case, the response body will contain a JSON object with a message describing the error.
{
"error": "Error message."
}
The API has a rate limit of 100 requests per 10 seconds.
The following information will be sent back in the response header (example values):
X-Ratelimit-Limit: 100
X-Ratelimit-Remaining: 99
X-Ratelimit-Reset: 1712741510000
For any questions or issues with the API, please contact our partner support team at partners@extendify.com
The API includes a single endpoint for accessing site profiles.
GET /site-profile
Authorization: Bearer YOUR_TOKEN
Name | Type | Required | Description |
---|---|---|---|
url | String | No | The URL of the site to retrieve. Use the fully qualified domain name (FQDN). |
partnerId | String | No | Filter by partner ID. |
startDate | String | No | Filter sites by last updated date. Use an ISO 8601 date string. |
page | Number | No | Page number for pagination (default: 1). |
format | String | No | Response format: json (default) or csv . |
GET /site-profile
This will return all sites for all partner IDs the user has access to.
GET /site-profile?url=https://example.com
Querying for a specific site by URL will return an array with one site object.
GET /site-profile?partnerId=12345
This will return all sites for the specified partner ID.
GET /site-profile?format=csv
This will return the response in CSV format. See below for response information. The default is JSON.
GET /site-profile?startDate=2024-01-01
This will return only sites that were last updated on or after January 1st, 2024.
GET /site-profile?partnerId=12345&startDate=2024-01-01T00:00:00.000Z
This will return sites for partner ID 12345 that were last updated on or after the specified date and time.
Field | Description | Value Dynamics | Example |
---|---|---|---|
site_id | Unique identifier for the site | Static – never changes after creation | abc123ef-4567-8901-ghij-23456klmnop78 |
site_url | Site's full URL | Rarely changes – updated if the site domain is migrated | https://extendify.com/ |
site_title | Title of the site | Dynamic – updates if changed in WordPress | My Business Site |
site_created_at | When the site was first created | Static – timestamp of site creation | 2024-03-15T10:23:45Z |
site_language | Language code of the site | Rarely changes – reflects WordPress language settings | en-US |
site_version_wp | Installed WordPress version | Dynamic – reflects current WordPress version | 6.8.1 |
site_version_php | Installed PHP version | Dynamic – reflects current PHP version; may be null | 8.2.23 |
site_version_extendify | Installed Extendify version | Dynamic – updates when Extendify plugin updates | 1.19.5 |
site_theme | Active WordPress theme | Dynamic – reflects currently active theme | extendable |
site_plugins | List of active plugins | Dynamic – updates when plugins are activated/deactivated | extendify/extendify.php;... |
site_users | Total number of users | Dynamic – updates as users are added/removed | 12 |
site_users_admin | Total number of admin users | Dynamic – updates as admin users are added/removed | 2 |
site_pages_count | Number of published pages | Dynamic – updates as pages are created/removed; may be null | 5 |
site_posts_count | Number of published posts | Dynamic – updates as posts are created/removed; may be null | 8 |
site_last_updated_page | Last time a page was updated | Dynamic – updates when any page is modified; may be null | 2025-06-20T14:12:00Z |
site_last_updated_post | Last time a post was updated | Dynamic – updates when any post is modified; may be null | 2025-06-21T09:30:00Z |
site_last_login_admin | Last admin login time | Dynamic – reflects most recent admin login; may be null | 2025-07-09T17:55:10Z |
site_structure | Single or multi-page structure | Rarely changes – set during Launch; may change with site reset | single-page |
site_objective | Purpose provided by the user | Rarely changes – set during Launch; may change with site reset | ecommerce |
site_category | Business or Personal classification | Rarely changes – set during Launch; may change with site reset | Business |
site_goals | Website goals | Rarely changes – set during Launch; may change with site reset | seo;appointments |
site_launched | Whether Launch was completed | Rarely changes – once set to true doesn't change |
false |
site_status | Status of the site | Dynamic – ACTIVE (healthy), OFFLINE (>3s or error), INACTIVE (no check-in for 7+ days) |
ACTIVE |
launch_loaded_at | When the Launch screen was accessed | Static – null if never accessed |
2025-01-15T11:00:00Z |
launch_selected_pages | Pages selected during Launch for multi-page sites | Rarely changes – set during Launch; may change with site reset | about;contact;services |
partner_id | ID of the partner | Static – changes only if license is reassigned | partner-xyz |
partner_name | Name of the partner | Static – changes only if license is reassigned | Awesome Hosting Co |
extendify_installed | When Extendify was installed | Static – date of Extendify plugin installation | 2024-12-01T10:00:00Z |
last_checkin | Last Extendify sync | Dynamic – updates on every Extendify sync, typically once per day | 2025-07-10T08:00:00Z |
last_updated | Last site metadata update | Dynamic – updates on any relevant data change | 2025-07-10T12:30:00Z |
Each json response will follow the same structure, regardless of the number of sites returned.
{
"data": [
{
"site_id": "string",
"site_url": "string",
"site_title": "string",
"site_created_at": "2024-01-01T00:00:00.000Z",
"site_language": "string",
"site_version_wp": "string",
"site_version_php": "string",
"site_version_extendify": "string",
"site_theme": "string",
"site_plugins": ["string"],
"site_users": 1,
"site_users_admin": 1,
"site_pages_count": 1,
"site_posts_count": 1,
"site_last_updated_page": "2024-01-01T00:00:00.000Z",
"site_last_updated_post": "2024-01-01T00:00:00.000Z",
"site_last_login_admin": "2024-01-01T00:00:00.000Z",
"site_structure": "string",
"site_objective": "string",
"site_category": "string",
"site_goals": ["string"],
"site_launched": true,
"site_status": "string",
"launch_loaded_at": "2024-01-01T00:00:00.000Z",
"launch_selected_pages": ["string"],
"partner_id": "string",
"partner_name": "string",
"extendify_installed": "2024-01-01T00:00:00.000Z",
"last_checkin": "2024-01-01T00:00:00.000Z",
"last_updated": "2024-01-01T00:00:00.000Z"
}
],
"pagination": {
"total": 123,
"totalPages": 2,
"hasNextPage": true,
"hasPreviousPage": false,
"nextPage": 2,
"previousPage": false,
"currentPage": 1,
"pageSize": 100
}
}
The CSV response will contain the same data as the JSON response, but in a comma-separated format. Additionally, the pagination information will be included in the response headers.
Content-Type: text/csv
X-Total-Count: 123
X-Total-Pages: 2
X-Current-Page: 1
X-Page-Size: 100
X-Has-Next-Page: 1
X-Has-Previous-Page: 0
X-Previous-Page: -1
X-Next-Page: 2
site_id,site_url,site_title,site_created_at,site_language,site_version_wp,site_version_php,site_version_extendify,site_theme,site_plugins,site_users,site_users_admin,site_pages_count,site_posts_count,site_last_updated_page,site_last_updated_post,site_last_login_admin,site_structure,site_objective,site_category,site_goals,site_launched,launch_loaded_at,launch_selected_pages,partner_id,partner_name,extendify_installed,last_checkin,last_updated
"abc123","https://www.example.com","Example Site","2024-01-01T00:00:00.000Z","en-US","6.2","8.1","1.2.3","twentytwentythree","plugin1;plugin2","1","1","5","10","2024-01-01T00:00:00.000Z","2024-01-01T00:00:00.000Z","2024-01-01T00:00:00.000Z","structure","objective","category","goal1;goal2","true","2024-01-01T00:00:00.000Z","home:about","partner1","Partner Name","2024-01-01T00:00:00.000Z","2024-01-01T00:00:00.000Z","2024-01-01T00:00:00.000Z"
...
Every response will include pagination information in the response. For CSV responses, this information will be included in the headers. The pagination information includes:
Key | Description |
---|---|
X-Total-Count | Total number of results |
X-Total-Pages | Total number of pages |
X-Current-Page | Current page number |
X-Page-Size | Number of items per page |
X-Has-Next-Page | 1 if next page exists |
X-Has-Previous-Page | 1 if previous page exists |
X-Previous-Page | Previous page number or -1 |
X-Next-Page | Next page number or -1 |