Allows to download CSV file with raw RUM data.
Overview and requirements
This endpoint returns an S3 pre-signed URL for the specified RUM export file. The URL expires in 10 minutes.
Daily exports
RUM export files are done on a daily basis and contain the data from 00:00:00 to 23:59:59 UTC.
Files become available after 5am UTC. If you try to access the file between midnight and 5am you'll get a URL that returns an error.
This API endpoint is not enabled by default. In order to use this endpoint, you must check the Enable RUM export API checkbox in your SpeedCurve team's RUM settings. Please note that RUM export data will only be generated from that point in time forwards.
Hourly exports
Use date
(day in YYYYMMDD
format) and hour
(0-23) request parameters to retrieve hourly exports up to last hour.
Last hour data becomes available 15 minutes past.
Example request: https://api.speedcurve.com/v1/lux/export/?date=20241025&hour=3
Rate limits
Please note that rate limits applied to this API and you can only send 3 requests per minute.
File Format and Schema
The RUM export file is in CSV syntax. Instead of comma, the delimiter is the caret character (^).
Each row in the export can be one of three types:
-
Main Row
There will always be one main row and it can be identified by
numdomelements > 0
-
User Timing Row
There can be zero or more user timing rows depending on how many marks and measures are present on the page. These rows can be identified by
uttime > 0
-
Interaction Row
If a visitor interacts with the page after the first beacon has been sent then there will be a separate interaction row that can be identified by
ixtime > 0
The fields and schema are:
Page info
Field | Type | Description |
---|---|---|
luxid | BIGINT | Unique ID for this page view. |
sessionid | BIGINT | Unique ID for this session. |
epoch | INT | Epoch time the information was recorded. |
account_id | INT | Your account/team ID. |
pagelabel | VARCHAR (255) | Label for the page. If no label was specified using LUX.label the document title is used. |
url | Empty field | Deprecated in July 2020 and removed in February 2022. Use the hostname and pathname fields instead. |
useragent | VARCHAR (500) | Full User Agent HTTP request header. |
pbrowser | VARCHAR (64) | Pretty browser name. |
flags | INT | Bitmask of flags (1 = SPA page view, 2 = Nav Timing not available, 4 = User Timing not available) |
Geo Info
Field | Type | Description |
---|---|---|
continent | VARCHAR (2) | |
country | VARCHAR (2) | |
postal | Empty field | Deprecated, will be empty |
city | VARCHAR (64) |
Page Stats
Field | Type | Description |
---|---|---|
extScripts | SMALLINT | Number of external scripts. |
blockingExtScripts | SMALLINT | Number of blocking external scripts. |
stylesheets | SMALLINT | Number of stylesheets. |
blockingStylesheets | SMALLINT | Number of blocking stylesheets. |
fonts | SMALLINT | Number of font files. |
imagesAtf | SMALLINT | Number of images in the viewport. |
avgDomDepth | SMALLINT | Average DOM depth. |
numDomElements | INT | Number of DOM elements. |
viewport_w | INT | Viewport width. |
viewport_h | INT | Viewport height. |
document_w | INT | Document width. |
document_h | INT | Document height. |
Navigation timing metrics
Field | Type |
---|---|
navigationStart | INT |
redirectStart | INT |
redirectEnd | INT |
fetchStart | INT |
domainLookupStart | INT |
domainLookupEnd | INT |
connectStart | INT |
secureConnectionStart | INT |
connectEnd | INT |
requestStart | INT |
responseStart (TTFB) | INT |
responseEnd | INT |
domLoading | INT |
domInteractive | INT |
domContentLoadedEventStart | INT |
domContentLoadedEventEnd | INT |
domComplete | INT |
loadEventStart | INT |
loadEventEnd | INT |
Other timing metrics
Field | Type | Description |
---|---|---|
startRender | INT | Start render time |
FID | INT | First Input Delay |
cpu | VARCHAR (128) | Long Tasks timing information. Format detail. |
Interaction (IX) metrics, INP attribution and subparts
Only interaction with the largest INP value collected for each page view. SpeedCurve doesn't report on subsequent interactions or any smaller INP values that may have occurred before the largest.
Field | Type | Description |
---|---|---|
ixtype | VARCHAR (32) | scroll, click, or key |
ixtime | INT | When the interaction occurred. |
trackId | VARCHAR (32) | DOM element data-sctrack attribute or ID (only valid for click and key) |
ixX | INT | The x position of the trackid DOM element. |
ixY | INT | The y position of the trackid DOM element. |
inp | INT | Interaction to Next Paint duration value |
inp_element_selector | VARCHAR (100) | INP Element Selector |
inp_start_time | INT | INP Start Time - the time that the user interaction started (when the input was received). |
inp_input_delay | INT | INP Input Delay - the time from interaction start until the event handler is able to run. |
inp_processing_time | INT | INP Processing time - the time it takes event callbacks, initiated by the interaction, to complete. |
inp_presentation_delay | INT | INP Presentation Delay - the time it takes the frame to be presented after the event callbacks are completed. |
Learn more about INP attribution and subparts.
User timing metrics and customer data
Field | Type | Description |
---|---|---|
utname | VARCHAR (128) | Name of the mark or measure. |
uttime | INT | Time of the mark (relative to navigationStart) or duration of the measure. |
customerdata | VARCHAR (512) | Data specified using LUX.addData() Format detail. |
Additional data
Field | Type | Description |
---|---|---|
devicetype | VARCHAR (32) | "mobile", "tablet", or "desktop". |
imagesTotal | SMALLINT | Total number of IMG tags in the document. |
htmlSize | INT | Transfer size (bytes) of the first HTML document. |
connType | VARCHAR (32) | Connection type. |
fcp | INT | First Contentful Paint. |
inlinescriptsize | INT | Uncompressed inline script size (bytes). |
inlinestylesize | INT | Uncompressed inline style size (bytes). |
devicememory | INT | Estimated device memory (GB). |
lcp | INT | Largest Contentful Paint. |
elementtiming | VARCHAR (255) | Element timing data. Format detail. |
dcls | FLOAT (4) | The document cumulative layout score up until the time when RUM beacon was sent. |
host | VARCHAR (255) | Domain the beacon was sent from e.g. if URL was https://example.com/about this value would be example.com |
path | VARCHAR (255) | Path from the URL the beacon was sent from e.g. if URL was https://example.com/about this value would be /about |
CPU format
The cpu field is a delimited string with this syntax:
type|total,n|count,d|median,x|max,[i|first_cpu_idle,]start|duration[,start|duration] [|type|total,n|count,d|median,x|max,start|duration[,start|duration]]
Currently the only type supported is JavaScript ("s") as this is the only data available from the Long Tasks API at this time. This example shows there were three long tasks starting at 306 ms, 448 ms, and 534 ms that totalled to 806 ms:
s|806,n|3,d|448,x|534,i|1134,306|128,448|78,534|600
Customerdata format
The customerdata
field represents custom data variables as a delimited string containing name-value tuples for each variable set using LUX.addData()
. The name-value tuple is delimited by "|". The tuples are comma-delimited. An example value from speedcurve.com is:
,loggedin|yes,team|1,tvmode|0,
Elementtiming format
The elementtiming field is a delimited string containing name-value pairs for each element measured using the Element Timing API. The name-value pair is delimited by "|". The pairs are comma-delimited. An example value is:
nav-links|1409,nav-title|1409,lead-image|2255
This indicates that the nav-links element was displayed 1409 ms after navigation start, nav-title after 1409 ms, and lead-image after 2255 ms.
Data Structure
There are three types of rows in the export file: Main, User Timing, and Interaction Metrics. For a given page view, there can be multiple rows:
- There is always one-and-only-one Main row.
- If there are "n" User Timing marks and measures in the page, then there are "n-1" separate User Timing rows. (The first User Timing mark or measure is included in the Main row.)
- If the user interacts with the page, there is typically a separate Interaction Metrics row. (It's possible for the interaction metrics to be in the Main row if the user interacts before the window load event.)
In the following sections we describe each type of row.
Main rows
Main rows contain the information for the overall page:
- Page info
- Geo info
- Page stats
- Navigation Timing metrics
- Other timing metrics
If there were any User Timing marks or measures, the Main row contains one of these metrics. Additionally, if the user interacted with the page before the window load event, the Main row contains the Interaction Metrics.
Here's an example of a Main row from speedcurve.com:
153384288740141560^153384288740141560^1533842889^1^.blog-post^https://www.speedcurve.com/blog/performance-improvement-checklist/^Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36^Chrome 68^^NA^US^95051^santa clara^10^0^4^3^^3^8^399^1032^1268^4056^1268^1533842886766^^^4^19^63^63^134^216^216^379^390^394^1088^1089^1095^2011^2011^2028^938^2^s|388,640|201,869|60,1049|57,1176|70^^^^^^speedcurvecss applied^613^,team|1,loggedin|yes,tvmode|0,
Here's the same Main row broken out by individual value:
luxid: 153384288740141560
sessionid: 153384288740141560
epoch: 1533842889
account_id: 1
pagelabel: .blog-post
url: https://www.speedcurve.com/blog/performance-improvement-checklist/
useragent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
pbrowser: Chrome 68
flags:
continent: NA
country: US
postal: 95051
city: santa clara
extScripts: 10
blockingExtScripts: 0
stylesheets: 4
blockingstylesheets: 3
fonts:
imagesAtf: 3
avgDomDepth: 8
numDomElements: 399
viewport_w: 1268
viewport_h: 1032
document_w: 1268
document_h: 4056
navigationStart: 1533842886766
redirectStart:
redirectEnd:
fetchStart: 4
domainLookupStart: 19
domainLookupEnd: 63
connectStart: 63
secureConnectionStart: 134
connectEnd: 216
requestStart: 216
responseStart: 379
responseEnd: 390
domLoading: 394
domInteractive: 1088
domContentLoadedEventStart: 1089
domContentLoadedEventEnd: 1095
domComplete: 2011
loadEventStart: 2011
loadEventEnd: 2028
startRender: 938
FID: 2
cpu: s|388,640|201,869|60,1049|57,1176|70
ixtype:
ixtime:
trackId:
ixX:
ixY:
utname: speedcurvecss applied
uttime: 613
customerdata: ,team|1,loggedin|yes,tvmode|0,
User timing rows
User Timing rows contain the User Timing metrics plus some other fields to aid in querying:
- Page info
- Geo info
- User Timing metrics and Customer Data
Here's an example of a User Timing row from speedcurve.com:
153384288740141560^153384288740141560^1533842889^1^.blog-post^https://www.speedcurve.com/blog/performance-improvement-checklist/^^Chrome 68^^NA^US^95051^santa clara^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^speedcurvejs eval^23^,team|1,loggedin|yes,tvmode|0,
Here's the same User Timing row broken out by individual value. Note how most of the fields are empty.
luxid: 153384288740141560
sessionid: 153384288740141560
epoch: 1533842889
account_id: 1
pagelabel: .blog-post
url: https://www.speedcurve.com/blog/performance-improvement-checklist/
useragent:
pbrowser: Chrome 68
flags:
continent: NA
country: US
postal: 95051
city: santa clara
extScripts:
blockingExtScripts:
stylesheets:
blockingstylesheets:
fonts:
imagesAtf:
avgDomDepth:
numDomElements:
viewport_w:
viewport_h:
document_w:
document_h:
navigationStart:
redirectStart:
redirectEnd:
fetchStart:
domainLookupStart:
domainLookupEnd:
connectStart:
secureConnectionStart:
connectEnd:
requestStart:
responseStart:
responseEnd:
domLoading:
domInteractive:
domContentLoadedEventStart:
domContentLoadedEventEnd:
domComplete:
loadEventStart:
loadEventEnd:
startRender:
FID:
cpu:
ixtype:
ixtime:
trackId:
ixX:
ixY:
utname: speedcurvejs eval
uttime: 23
customerdata: ,team|1,loggedin|yes,tvmode|0,
Interaction metrics rows
Interaction Metrics rows contain the user interaction information plus some other fields to aid in querying:
- Page info
- Geo info
- Interaction (IX) metrics
- Customer Data
Here's an example of an Interaction Metrics row from speedcurve.com:
153384288740141560^153384288740141560^1533842889^1^.blog-post^https://www.speedcurve.com/blog/performance-improvement-checklist/^^Chrome 68^^NA^US^95051^santa clara^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^click^10582^nav^154^27^^^,team|1,loggedin|yes,tvmode|0,
Here's the same Interaction Metrics row broken out by individual value. Note how most of the fields are empty.
luxid: 153384288740141560
sessionid: 153384288740141560
epoch: 1533842889
account_id: 1
pagelabel: .blog-post
url: https://www.speedcurve.com/blog/performance-improvement-checklist/
useragent:
pbrowser: Chrome 68
flags:
continent: NA
country: US
postal: 95051
city: santa clara
extScripts:
blockingExtScripts:
stylesheets:
blockingstylesheets:
fonts:
imagesAtf:
avgDomDepth:
numDomElements:
viewport_w:
viewport_h:
document_w:
document_h:
navigationStart:
redirectStart:
redirectEnd:
fetchStart:
domainLookupStart:
domainLookupEnd:
connectStart:
secureConnectionStart:
connectEnd:
requestStart:
responseStart:
responseEnd:
domLoading:
domInteractive:
domContentLoadedEventStart:
domContentLoadedEventEnd:
domComplete:
loadEventStart:
loadEventEnd:
startRender:
FID:
cpu:
ixtype: click
ixtime: 10582
trackId: nav
ixX: 154
ixY: 27
utname:
uttime:
customerdata: ,team|1,loggedin|yes,tvmode|0,
Query tips
Here are some tips for querying the data.
- Use "luxid" to get all the rows for a single page view.
- Use "sessionid" to get all the rows for a single session.
- To find all Main rows, query for numdomelements > 0. This is because some browsers still do not support Navigation Timing, but all pages have a non-zero number of DOM elements, and the number of DOM elements is only stored in Main rows.
- The easiest way to find all User Timing rows is to query for uttime > 0. Note that this will return one Main row that has the first User Timing metric.
- The easiest way to find all Interaction Metrics rows is to query for ixtime > 0. Note that this may return a Main row is the user interacted with the page before the window load event.
- To find a specific customer data variable, prepend it with a comma. For example:
customerdata like ',loggedin%'