Single Page Tests (or SPTs for short) are synthetic speed tests for a URL of your choosing. The aim of SPTs is to provide fast feedback directly in your CLI or as part of a Continuous integration or deployment pipeline.
Each SPT is a totally independent report for a single page. There is no connection between SPTs and Sites within your account. You can use either concept independently.
Every SPT has a randomly generated public URL. You can create private tests (only viewable by logged-in members of your organisation) using the --private flag.
By default, SPTs expire after 1 year, you can specify expiry using the --expiresAt flag (Minimum 1 day, Maximum 2 years).
Tests can be run from different locations, using a range of device emulation and connection options. Experiment with the --location,--device and --connection flags.
1# This command will block until the test has been completed2calibre test create "https://calibreapp.com" \3 --location=Sydney \4 --device=Desktop \5 --connection=cable \6 --private \7 --waitForTest
1#!/usr/bin/env node23import { Test } from 'calibre'45const createTest = async () => {6 // Required parameters7 const url = 'https://calibreapp.com/docs/automation/cli'8 const location = 'Sydney'9 const device = 'Desktop'10 const connection = 'cable'1112 // Optional parameters ๐13 const expiresAt = new Date(Date.now() + 31556952000).toISOString() // Optional, Default = 1 year14 const isPrivate = true // Default = false1516 const cookies = [17 {18 name: 'app.uid',19 value: 'my-secret-tokens',20 domain: 'calibreapp.com',21 path: '/',22 secure: true,23 httpOnly: true24 }25 ]26 const headers = [27 {28 name: 'User-Agent',29 value: 'My Custom User Agent'30 }31 ]3233 // Create the test34 const { uuid } = await Test.create({35 url,36 location,37 device,38 connection,39 cookies,40 headers,41 isPrivate42 })4344 console.log(`Test created, ID: ${uuid}`)4546 // Wait for the test to be run47 const results = await Test.waitForTest(uuid)4849 // Output the formatted JSON response50 console.log(JSON.stringify(results, null, 2))51}5253createTest()
1โ Test complete: https://calibreapp.com/tests/<uuid>/<share token>2Performance report for your page. Learn more about Calibreโs Single Page Tests โ34### Test summary56โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ7โ Tested page โ Test status โ Test location โ Device emulation โ Connection speed โ8โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโค9โ Inspect page โ โ Completed (Inspect test) โ Sydney, Australia โ Chrome Desktop โ Cable โ10โโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโ1112### Web Vitals1314Web Vitals assessment passed. Learn more about Web Vitals โ1516โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ17โ Largest Contentful Paint โ Cumulative Layout Shift โ Total Blocking Time โ18โโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโค19โ 821ms (โ Good) โ 0.001 (โ Good) โ 83ms (โ Good) โ20โโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโ2122### Assets transferred2324โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโ25โ Metric โ Value โ26โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค27โ Total Font Transferred โ 231 KB โ28โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค29โ Total JavaScript Transferred โ 209 KB โ30โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค31โ Total HTML Transferred โ 33.1 KB โ32โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค33โ Total Image Transferred โ 27.5 KB โ34โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค35โ Total JSON Transferred โ 1.23 KB โ36โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค37โ Total CSS Transferred โ 1012 Bytes โ38โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค39โ Total Video Transferred โ 0 Bytes โ40โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค41โ Total Page Transferred โ 502 KB โ42โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโ
1{2 "uuid": "dfa1a00",3 "url": "https://calibreapp.com",4 "formattedTestUrl": "https://calibreapp.com/tests/dfa1a00/9f0cb96",5 "status": "completed",6 "updatedAt": "2024-07-25T06:11:09Z",7 "adBlockerIsEnabled": false,8 "runtimeError": {},9 "metrics": [10 {11 "name": "largest-contentful-paint",12 "label": "Largest Contentful Paint",13 "value": 150414 }15 // More metrics here16 ],17 "device": {18 "title": "Desktop"19 },20 "connection": {21 "title": "Cable"22 },23 "location": {24 "name": "Sydney, Australia",25 "emoji": "๐ฆ๐บ"26 }27}
You can read CLI documentation for calibre test create here.
You can create page tests that automatically send JSON results to a webhook URL for processing and analysis. This is useful for integrating with other systems, such as CI/CD pipelines or custom integrations.
Webhooks can be verified using --webhookSecret flag or webhookSecret API parameter. The shared secret value will be signed using a HMAC cryptographic hash signature, which can be found on the Calibre-HMAC-SHA256-Signature HTTP header of the webhook request.
1# Create a test then exit. Results will be sent to the webhook URL2calibre test create "https://example.com" \3 --location=Sydney \4 --device=PageSpeedDesktop \5 --private \6 --webhookUrl=https://my-webhook-url.com \7 --webhookSecret=my-secret
1#!/usr/bin/env node2import { Test } from 'calibre'3const createTest = async () => {4 // Required parameters5 const url = 'https://example.com'6 const location = 'Sydney'7 const device = 'PageSpeedDesktop'89 // POST Single Page Test results to a Webhook URL for processing and analysis10 const webhookUrl = 'https://my-webhook-url.com' // Optional11 const webhookSecret = 'my-secret-webhook-token' // Optional1213 const isPrivate = true // Default = false1415 // Create the test16 const { uuid } = await Test.create({17 url,18 location,19 device,20 webhookUrl,21 webhookSecret,22 isPrivate23 })2425 console.log(`Test created, ID: ${uuid}`)26}27createTest()
1# Pro tip: Add the --json flag for JSON output2calibre test show <uuid>
1#!/usr/bin/env node23import { Test } from 'calibre'45const getTestData = async () => {6 // Required7 const uuid = 'dfa1a00'89 // Fetch the test results10 const results = await Test.getTestByUuid(uuid)1112 // Output the formatted JSON response13 console.log(JSON.stringify(results, null, 2))14}1516getTestData()
1โ Test complete: https://calibreapp.com/tests/<uuid>/<share token>2Performance report for your page. Learn more about Calibreโs Single Page Tests โ34### Test summary56โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ7โ Tested page โ Test status โ Test location โ Device emulation โ Connection speed โ8โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโค9โ Inspect page โ โ Completed (Inspect test) โ Sydney, Australia โ Chrome Desktop โ Cable โ10โโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโ1112### Web Vitals1314Web Vitals assessment passed. Learn more about Web Vitals โ1516โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ17โ Largest Contentful Paint โ Cumulative Layout Shift โ Total Blocking Time โ18โโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโค19โ 821ms (โ Good) โ 0.001 (โ Good) โ 83ms (โ Good) โ20โโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโ2122### Assets transferred2324โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโ25โ Metric โ Value โ26โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค27โ Total Font Transferred โ 231 KB โ28โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค29โ Total JavaScript Transferred โ 209 KB โ30โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค31โ Total HTML Transferred โ 33.1 KB โ32โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค33โ Total Image Transferred โ 27.5 KB โ34โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค35โ Total JSON Transferred โ 1.23 KB โ36โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค37โ Total CSS Transferred โ 1012 Bytes โ38โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค39โ Total Video Transferred โ 0 Bytes โ40โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโค41โ Total Page Transferred โ 502 KB โ42โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโ
1{2 "uuid": "dfa1a00",3 "url": "https://calibreapp.com",4 "formattedTestUrl": "https://calibreapp.com/tests/dfa1a00/9f0cb96",5 "status": "completed",6 "updatedAt": "2019-07-25T06:11:09Z",7 "adBlockerIsEnabled": false,8 "runtimeError": {},9 "metrics": [10 {11 "name": "json_body_size_in_bytes",12 "label": "Total JSON size in bytes",13 "value": 1538314 },15 {16 "name": "json_size_in_bytes",17 "label": "Total JSON transferred",18 "value": 1148319 },20 {21 "name": "image_body_size_in_bytes",22 "label": "Total Image size in bytes",23 "value": 23812024 },25 {26 "name": "image_size_in_bytes",27 "label": "Total Image transferred",28 "value": 7707729 },30 {31 "name": "font_body_size_in_bytes",32 "label": "Total Webfont size in bytes",33 "value": 11012534 },35 {36 "name": "font_size_in_bytes",37 "label": "Total Webfont transferred",38 "value": 11154839 },40 {41 "name": "js_body_size_in_bytes",42 "label": "Total JavaScript size in bytes",43 "value": 215335444 },45 {46 "name": "js_size_in_bytes",47 "label": "Total JavaScript Transferred",48 "value": 51616449 },50 {51 "name": "css_body_size_in_bytes",52 "label": "Total CSS size in bytes",53 "value": 8045154 },55 {56 "name": "css_size_in_bytes",57 "label": "Total CSS transferred",58 "value": 1746059 },60 {61 "name": "html_body_size_in_bytes",62 "label": "Total HTML size in bytes",63 "value": 2498764 },65 {66 "name": "html_size_in_bytes",67 "label": "Total HTML transferred",68 "value": 1068069 },70 {71 "name": "page_wait_timing",72 "label": "Response time",73 "value": 44574 },75 {76 "name": "page_size_in_bytes",77 "label": "Total Page transferred",78 "value": 74853779 },80 {81 "name": "page_body_size_in_bytes",82 "label": "Total Page size in bytes",83 "value": 262412084 },85 {86 "name": "asset_count",87 "label": "Number of requests",88 "value": 4589 },90 {91 "name": "onload",92 "label": "onLoad",93 "value": 257294 },95 {96 "name": "oncontentload",97 "label": "onContentLoad",98 "value": 167199 },100 {101 "name": "lighthouse-seo-score",102 "label": "Lighthouse SEO Score",103 "value": 91104 },105 {106 "name": "lighthouse-best-practices-score",107 "label": "Lighthouse Best Practices Score",108 "value": 93109 },110 {111 "name": "lighthouse-accessibility-score",112 "label": "Lighthouse Accessibility Score",113 "value": 76114 },115 {116 "name": "lighthouse-performance-score",117 "label": "Lighthouse Performance Score",118 "value": 75119 },120 {121 "name": "visually_complete_85",122 "label": "85% Visually Complete",123 "value": 1872124 },125 {126 "name": "visually_complete",127 "label": "Visually Complete",128 "value": 9288129 },130 {131 "name": "consistently-interactive",132 "label": "Time to Interactive",133 "value": 7408134 },135 {136 "name": "first-interactive",137 "label": "First CPU Idle",138 "value": 7408139 },140 {141 "name": "time-to-first-byte",142 "label": "Time to First Byte",143 "value": 402144 },145 {146 "name": "speed_index",147 "label": "Speed Index",148 "value": 1822149 },150 {151 "name": "first-meaningful-paint",152 "label": "First Meaningful Paint",153 "value": 1504154 },155 {156 "name": "first-contentful-paint",157 "label": "First Contentful Paint",158 "value": 1504159 },160 {161 "name": "firstRender",162 "label": "First Paint",163 "value": 1504164 }165 ],166 "device": {167 "title": "Motorola Moto G4"168 },169 "connection": {170 "title": "Emerging Markets 3G"171 },172 "location": {173 "name": "North Virginia, USA",174 "emoji": "๐บ๐ธ"175 }176}
You can read CLI documentation for calibre test show here.
For each Single Page Test, Calibre stores the following information:
You can obtain Single Page Test artifacts with the CLI and the Node.js API. When using the CLi, files will be saved to a test-artifacts directory. The Node.js API will return a list of URLs where the files can be downloaded.
1calibre test download-artifacts <uuid>
1#!/usr/bin/env node23import { Test } from 'calibre'45const getTestArtifactUrls = async () => {6 // Required7 const uuid = 'dfa1a00'89 // Fetch the test results10 const results = await Test.fetchArtifacts(uuid)1112 // Output the formatted JSON response13 console.log(JSON.stringify(results, null, 2))14}1516getTestArtifactUrls()
1โ Fetching test artifact URLs2โ Screenshot3โ MP4 Video Render4โ HAR5โ Lighthouse Report67Saved artifacts to test-artifacts/dfa1a00
1{2 "uuid": "dfa1a00",3 "har": "https://calibre-screenshots-prod.s3.amazonaws.com/ef1ae88af9f4d643196a76cb62608449/b989bfe74fa26bed5063afb098e7ec4b.json.gz?X-Amz-Expires=3600&X-Amz-Date=20190725T061832Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAITFRYATLYAH7W3VQ/20190725/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=71cfa944d9c8243a55149091efb88913ef99b7d3373f44f7c4f28a69b0a1279d",4 "lighthouse": "https://calibre-screenshots-prod.s3.amazonaws.com/ef1ae88af9f4d643196a76cb62608449/f92ce9906f4a55728df1ff112246e079.json.gz?X-Amz-Expires=3600&X-Amz-Date=20190725T061832Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAITFRYATLYAH7W3VQ/20190725/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=3cdb6e1fea6e00aa8c3e69d42b68aef0f1236550b858a8cc34bd7073275dd562",5 "image": "https://calibre-screenshots-prod.s3.amazonaws.com/eb9dd012-7480-4368-b1f9-9e9f50e4f9f0/screenshot/screenshot.jpg",6 "video": "https://calibre-screenshots-prod.s3.amazonaws.com/eb9dd012-7480-4368-b1f9-9e9f50e4f9f0/video-timeline/screencast.mp4"7}
You can read CLI documentation for calibre test download-artifacts here.
1calibre test list
1#!/usr/bin/env node23import { Test } from 'calibre'45const listAllTests = async () => {6 // Fetch the test list7 const tests = await Test.getList()89 // Output the formatted JSON response10 console.log(JSON.stringify(tests, null, 2))11}1213listAllTests()
1UUID | URL | DEVICE | CONNECTION | LOCATION | STATUS2dfa1a00 | calibreapp.com/ | Motorola Moto G4 | Not Throttled | ๐บ๐ธ North Virginia | Completed 4:11pm 25-Jul-20193efa99de | calibreapp.com/ | Motorola Moto G4 | Not Throttled | ๐บ๐ธ North Virginia | Completed 4:36pm 25-Jul-2019
1[2 {3 "uuid": "dfa1a00",4 "url": "https://calibreapp.com",5 "formattedTestUrl": "https://calibreapp.com/tests/dfa1a00/9f0cb96",6 "adBlockerIsEnabled": false,7 "device": {8 "title": "Motorola Moto G4"9 },10 "connection": {11 "title": "Emerging Markets 3G"12 },13 "location": {14 "emoji": "๐บ๐ธ",15 "shortName": "North Virginia"16 },17 "status": "completed",18 "updatedAt": "2019-07-25T06:11:09Z"19 },20 {21 "uuid": "efa99de",22 "url": "https://calibreapp.com",23 "formattedTestUrl": "https://calibreapp.com/tests/efa99de/39d030e",24 "adBlockerIsEnabled": false,25 "device": {26 "title": "Motorola Moto G4"27 },28 "connection": {29 "title": "Emerging Markets 3G"30 },31 "location": {32 "emoji": "๐บ๐ธ",33 "shortName": "North Virginia"34 },35 "status": "completed",36 "updatedAt": "2019-07-25T06:36:18Z"37 }38]
You can read CLI documentation for calibre test list here.
On this page