Extendify Analytics API Documentation

Version 2

Overview

The Extendify Analytics API allows authorized partners to access information about multiple sites on their service, with flexible filtering and pagination.

API Versioning

The current version is v2, and it should be included in the base URL of all requests:

https://insights.extendify.com/api/v2/

Access

All endpoints require authorization.

Authorization: Bearer API_TOKEN

Ensure your API key is kept secure and not exposed in shared or public spaces.

General Error Handling

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."
}

Rate Limiting

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

Support

For any questions or issues with the API, please contact our partner support team at partners@extendify.com

Endpoints

The API includes a single endpoint for accessing site profiles.

Get site profiles

GET /site-profile

Headers

Authorization: Bearer YOUR_TOKEN

Query Parameters

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 info for all sites:
GET /site-profile

This will return all sites for all partner IDs the user has access to.

Get site info for a specific url:
GET /site-profile?url=https://example.com

Querying for a specific site by URL will return an array with one site object.

Get all sites for a specific partner ID:
GET /site-profile?partnerId=12345

This will return all sites for the specified partner ID.

Get site info in CSV format:
GET /site-profile?format=csv

This will return the response in CSV format. See below for response information. The default is JSON.

Filter sites by last updated date:
GET /site-profile?startDate=2024-01-01

This will return only sites that were last updated on or after January 1st, 2024.

Filter sites with date and partner ID:
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.

Response Fields

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

Successful Response

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
    }
}

CSV Response

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.

Example CSV 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

Response Body

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"
...

Pagination

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