Managing Site Reports
This guide shows you how to create and manage Site Report schedules using the WP Engine Hosting API. You’ll learn to list templates, select report sections, create schedules, and retrieve generated reports.
You can run Site Reports on production environments that have had a custom domain pointed for at least two days. This time lag ensures all data needed to populate the Site Report is available.
When you create a scheduled Site Report, select which content sections to include in the report itself. You can schedule Site Reports to run weekly, every two weeks, or monthly.
If you have a Premium or Agency plan, you can apply custom branding to the report (add your logo, color, and company name to the report cover and remove references to WP Engine from the content sections) and deliver reports to any email address. On other plans, you can only create reports with WP Engine branding and deliver them to email addresses of users on your account.
Key Terms
Section titled “Key Terms”- Reports - refers to the actual pdf file generated when a Site Report is run at a scheduled time.
- Schedules - these are the active scheduled report runs for a given environment. Each schedule includes all of the information needed to create and email a report. Each environment can have a maximum of three schedules.
- Templates - contain branding and report content information. These are re-usable and can be used to create new schedules with the same branding and contents as used in previous schedules.
- Recipients - the email addresses of the people a scheduled Site Report is sent to.
1. (Optional) Create Template in User Portal
Section titled “1. (Optional) Create Template in User Portal”Login to WP Engine’s User Portal and create a One-time Site Report, adding your preferred branding and company name. Check the “Save as template” box on the Report settings page to create a re-usable Template. See Site Report Support article for more information.
2. List Templates to get Template ID you want to use
Section titled “2. List Templates to get Template ID you want to use”Use the List report templates endpoint to returns a list of report templates available for Site Reports.
Example request:
# Replace 12345 with your account IDcurl -X GET \--url "https://api.wpengineapi.com/v1/site_reports/templates?account_id=12345" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD"const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");const accountId = 12345; // replace with your account ID
try { const res = await fetch(`https://api.wpengineapi.com/v1/site_reports/templates?account_id=${accountId}`, { method: "GET", headers: { Authorization: auth, "Content-Type": "application/json" } }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }Example response:
{ "templates": [ { "template_uuid": "12345678-90abc-defg-hijk-1234567890ab", "template_name": "Quick Data Template", "sections": [ { "name": "cover" }, { "name": "overview" }, { "name": "plugins" } ] }, { "template_uuid": "12345678-90abc-defg-hijk-1234567890ac", "company_name": "ABC Agency", "template_name": "Branded template", "logo_url": "https://storage.googleapis.com/image-container/agency_logo.png", "preview_image_url": "https://storage.googleapis.com/image-container/agency_preview.png", "sections": [ { "name": "cover" }, { "name": "lighthouseOpportunitiesDesktop" }, { "name": "lighthouseOpportunitiesMobile" }, { "name": "lighthouseReportDesktop" }, { "name": "lighthouseReportMobile" }, { "name": "lighthouseTrends" } ], "brand_color": "#5B6C74" } ]}Key fields in the response for Templates:
- template_uuid - Unique identifier for the template
- template_name - Display name of the template
- sections - List of sections included in this template
- company_name - (Branding) Company name displayed on the report
- logo_url - (Branding) URL to the company/agency logo
- preview_image_url - (Branding) URL to template preview image
- brand_color - (Branding) Hex value of the color used on the report cover sheet
3. Available Report sections
Section titled “3. Available Report sections”Use the List report sections endpoint to return available selection of sections for creating a site report.
Example request:
curl -X GET \--url "https://api.wpengineapi.com/v1/site_reports/sections" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD"const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");
try { const res = await fetch('https://api.wpengineapi.com/v1/site_reports/sections', { method: "GET", headers: { Authorization: auth, "Content-Type": "application/json" } }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }Example of response:
{ "name": "siteReport", "resource_type": "site", "sections": [ { "name": "cover", "display_text": "Cover", "order": 1, "image_url": "https://storage.googleapis.com/cover.png", "mandatory": true }, { "name": "overview", "display_text": "Settings Overview", "order": 2, "image_url": "https://storage.googleapis.com/settings-overview.png", "footer_url": "https://my.wpengine.com/installs/{install_name}", "group_name": "overview", "group_display_text": "Overview" }, { "name": "usage", "display_text": "Usage and Updates Overview", "order": 3, "image_url": "https://storage.googleapis.com/usage-and-updates-overview.png", "group_name": "overview", "group_display_text": "Overview" }, { "name": "visitsAndBandwidth", "display_text": "Visits and Bandwidth", "order": 11, "image_url": "https://storage.googleapis.com/visits-and-bandwidth.png", "group_name": "usageAndUpdates", "group_display_text": "Usage and Updates" }, { "name": "plugins", "display_text": "Plugins", "order": 12, "image_url": "https://storage.googleapis.com/plugins.png", "footer_url": "https://my.wpengine.com/installs/{install_name}/plugins_and_themes#plugins", "group_name": "usageAndUpdates", "group_display_text": "Usage and Updates" } ]}Key fields in the response for Sections:
- name - Internal identifier for the section, used when creating a Site report
- display_text - Human-readable name for the section
- order - Display order of the section in the report
- image_url - Preview image URL for the section
- footer_url - Footer link URL for the section
- group_name - Group name referring to several related pages
- group_display_text - Human-readable name of the section group
- mandatory - Whether the section is required in all reports
4. Schedule a Report
Section titled “4. Schedule a Report”Use the Create a report schedule endpoint to schedule a site report.
Add more information from the previous endpoint responses if you want enhance your report:
- template_uuid - Add template ID to include Branding information, if there is any or leave it blank.
- sections - Add selected sections that are currently available in your site report. Template’s sections are overridden from this field.
Example request:
# Replace 12345 with your site IDcurl -X POST "https://api.wpengineapi.com/v1/site_reports/schedules" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD" \-H "Content-Type: application/json" \-d '{"site_id": "12345","title": "Sample schedule","next_scheduled_date": "2026-07-30T00:00:00.000Z","frequency": { "unit": "DAYS", "value": 7},"recipients": [ { "name": "John Doe", "email": "example@email.com" }],"sections": [ { "name": "cover" }, { "name": "overview" }, { "name": "themes" }],"template_uuid": ""}'const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");const schedule = {site_id: "12345", // replace with your site IDtitle: "Sample schedule",next_scheduled_date: "2026-07-30T00:00:00.000Z",frequency: { unit: "DAYS", value: 7},recipients: [ { name: "John Doe", email: "example@email.com" }],sections: [ { name: "cover" }, { name: "overview" }, { name: "themes" }],template_uuid: "" // replace with your template ID};
try {const res = await fetch("https://api.wpengineapi.com/v1/site_reports/schedules", { method: "POST", headers: { Authorization: auth, "Content-Type": "application/json" }, body: JSON.stringify(schedule) }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }Example of response:
{ "message": "OK!"}5. List report schedules
Section titled “5. List report schedules”Use the List report schedule endpoint to view the list of scheduled site report.
Example request:
# Replace 12345 with your site IDcurl -X GET "https://api.wpengineapi.com/v1/site_reports/schedules?site_id=12345" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD"const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");const siteId = 12345; // replace with your site ID
try {const res = await fetch(`https://api.wpengineapi.com/v1/site_reports/schedules?site_id=${siteId}`, { method: "GET", headers: { Authorization: auth, "Content-Type": "application/json" } }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }Example of response:
{ "schedules": [ { "title": "Sample Weekly Report", "next_scheduled_date": "2026-07-08T00:00:00Z", "frequency": { "value": 7, "unit": "DAYS" }, "recipients": [ { "name": "John Doe", "email": "john.doe@example.com" }, { "name": "Jane Doe", "email": "jane.doe@example.com" } ], "sections": [ { "name": "cover" }, { "name": "themes" } ], "uuid": "12345678-90ab-cdef-1234-567890abcdef" }, { "title": "Sample Monthly Report for every 15th of the month", "next_scheduled_date": "2026-07-09T00:00:00Z", "frequency": { "value": 15, "unit": "MONTHLY" }, "recipients": [ { "name": "John Doe", "email": "john.doe@example.com" } ], "sections": [ { "name": "cover" }, { "name": "lighthouseReportDesktop" }, { "name": "overview" }, { "name": "storage" } ], "uuid": "abcdef12-3456-7890-abcd-ef1234567890", "template_uuid": "3da39751-a53c-4642-b077-1234567890ab", "branding": { "uuid": "749436c8-d9e2-4f3e-8b1c-1234567890ac", "company_name": "Example Company", "logo_url": "https://storage.googleapis.com/container/logo.png", "image_preview_url": "https://storage.googleapis.com/container/image_preview.png", "brand_color": "#FF6944" } } ]}Key fields in the response for Schedules:
- uuid - Unique identifier for the schedule, reference for Update and Delete Schedule
- template_uuid - UUID of the report template used for this schedule
- branding - Branding configuration applied to the report
6. Update a report schedule
Section titled “6. Update a report schedule”Use the Update a report schedule endpoint to update a scheduled site report.
Example request:
# Replace 12345 with your schedule IDcurl -X PATCH "https://api.wpengineapi.com/v1/site_reports/schedules/12345" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD" \-H "Content-Type: application/json" \-d '{"title": "Sample schedule","next_scheduled_date": "2026-07-30T00:00:00.000Z","frequency": { "unit": "DAYS", "value": 7},"recipients": [ { "name": "John Doe", "email": "example@email.com" }],"sections": [ { "name": "cover" }, { "name": "overview" }, { "name": "themes" }]}'const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");const scheduleId = 12345; // replace with your schedule IDconst schedule = {title: "Sample schedule",next_scheduled_date: "2026-07-30T00:00:00.000Z",frequency: { unit: "DAYS", value: 7},recipients: [ { name: "John Doe", email: "example@email.com" }],sections: [ { name: "cover" }, { name: "overview" }, { name: "themes" }]};
try {const res = await fetch(`https://api.wpengineapi.com/v1/site_reports/schedules/${scheduleId}`, { method: "PATCH", headers: { Authorization: auth, "Content-Type": "application/json" }, body: JSON.stringify(schedule) }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }Example of response:
{ "message": "OK!"}7. Delete a report schedule
Section titled “7. Delete a report schedule”Use the Delete a report schedule endpoint to delete a scheduled site report.
Example request:
# Replace 12345 with your schedule IDcurl -X DELETE "https://api.wpengineapi.com/v1/site_reports/schedules/12345" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD"const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");const scheduleId = 12345; // replace with your schedule ID
try {const res = await fetch(`https://api.wpengineapi.com/v1/site_reports/schedules/${scheduleId}`, { method: "DELETE", headers: { Authorization: auth, "Content-Type": "application/json" } }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }8. List site reports
Section titled “8. List site reports”Use the List site reports endpoint to list all generated report.
Example request:
# Replace 12345 with your site IDcurl -X GET "https://api.wpengineapi.com/v1/site_reports?site_id=12345" \-u "$WPE_API_USER_ID:$WPE_API_PASSWORD"const user = process.env.WPE_API_USER_ID;const pass = process.env.WPE_API_PASSWORD;const auth = "Basic " + Buffer.from(`${user}:${pass}`).toString("base64");const siteId = 12345; // replace with your site ID
try {const res = await fetch(`https://api.wpengineapi.com/v1/site_reports?site_id=${siteId}`, { method: "GET", headers: { Authorization: auth, "Content-Type": "application/json" } }); if (!res.ok) throw new Error(`Request failed: ${res.status}`); console.log(await res.json());} catch (e) { console.error(e); }Example of response:
{ "reports": [ { "uuid": "12345678-90ab-cdef-1234-567890abcdef", "title": "Regular Site report", "date_range": { "start_date": "2026-05-08T14:22:26.532Z", "end_date": "2026-06-07T14:22:26.532Z" }, "created_at": "2026-06-08T14:22:33.171353Z", "download_url": "https://storage.googleapis.com/container/link-to-google-file" }, { "uuid": "12345678-90ab-cdef-1234-567890abcdeg", "title": "Scheduled Weekly site report", "date_range": { "start_date": "2026-06-25T02:14:02.853141Z", "end_date": "2026-07-02T02:14:02.853141Z" }, "created_at": "2026-07-03T02:14:02.900265Z", "recipients": [ { "email": "john.doe@example.com" } ], "download_url": "https://storage.googleapis.com/container/link-to-google-file" } ]}Key fields in the response for Reports:
- uuid - Unique identifier for the report
- title - Title of the report
- date_range - Time period covered by the report
- created_at - Timestamp when the report was generated
- recipients - Email recipients who received the report
- download_url - URL to download the report PDF
Verify
Section titled “Verify”After you create a schedule, confirm it works:
- Call the List report schedules endpoint (step 5) to verify your schedule appears in the list.
- Wait for
next_scheduled_dateto pass. - Call List site reports (step 8) to confirm the report generated successfully.
- Check the
download_urlto access the PDF and verify the content matches your configuration.