A Simple API containing a curated set of metrics about the health of a webpage from the technical SEO point of view. It should act as a starting point for an engineer who likes to play and learn more about extracting insights from web pages for the purposes of SEO or testing.
- nodejs >=12
- yarn > 1
To install dependecies
yarn install
To build and run
yarn starts
-
URL
/api/page-health
-
Method:
GET
-
URL Params
Required:
url=[string]
-
Response
The endpoints response will be an array of all the metrics below, each with a unique name and interface for the value property. If value property is an array, then the isArray
property will be true
.
type
property is the name of the data type of the value property and when value is an array, then type name will be the name of the data type of it's items.
[{
value: "any",
type: "string|number|object|boolean"
name: "string name of metric",
isArray: true | false
},
...
]
isResponsive
{
"value": true | false,
"type": "boolean",
"name": "isResponsive",
"isArray": false
}
isNoIndex
{
"value": true | false,
"type": "boolean",
"name": "isNoIndex",
"isArray": false
}
internalLinks
{
value: [{
href: "https://stackoverflow.com",
listeners: [{
type: "click",
useCapture: false,
passive: false,
once: false,
scriptId: "12",
lineNumber: 2,
columnNumber: 9085
}],
text: " Stack Overflow ",
healthy: true
}],
type: "object",
name: "internalLinks",
isArray: true
}
performanceMetrics
{
value: [{
name: "first-paint",
entryType: "paint",
startTime: 1171.500000054948,
duration: 0
},
{
name: "first-contentful-paint",
entryType: "paint",
startTime: 1171.500000054948,
duration: 0
}
],
type: "object",
name: "internalLinks",
isArray: true
}
PerformanceEntry: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry
tfIdfScore
{
value: [{
term: "http",
tf: 22,
idf: 0.3068528194400547,
tfidf: 6.750762027681204
},
{
term: "request",
tf: 22,
idf: 0.3068528194400547,
tfidf: 6.750762027681204
},
{
term: "status",
tf: 19,
idf: 0.3068528194400547,
tfidf: 5.830203569361039
}
],
type: "object",
name: "internalLinks",
isArray: true
}
responseStatus
{
"value": 200,
"type": "number",
"name": "responseStatus",
"isArray": false
}
schemaOrg
{
value: {
"microdata": {
"Product": [
{
"@context": "http://schema.org/",
"@type": "Product",
"brand": "ACME",
"name": "Executive Anvil",
"image": "anvil_executive.jpg",
"description": "Sleeker than ACME's Classic Anvil, the\n Executive Anvil is perfect for the business traveler\n looking for something to drop from a height.",
"mpn": "925872",
"aggregateRating": {
"@context": "http://schema.org/",
"@type": "AggregateRating",
"ratingValue": "4.4",
"reviewCount": "89"
},
"offers": {
"@context": "http://schema.org/",
"@type": "Offer",
"priceCurrency": "USD",
"price": "119.99",
"priceValidUntil": "5 November!",
"seller": {
"@context": "http://schema.org/",
"@type": "Organization",
"name": "Executive Objects"
},
"itemCondition": "http://schema.org/UsedCondition",
"availability": "http://schema.org/InStock"
}
}
]
},
"rdfa": {},
"jsonld": {},
"metatags": {
"priceCurrency": [
"USD",
"USD"
]
}
},
type: "object",
name: "schemaOrg",
isArray: false
}
redirectChain
{
value: [{
url: "https://stackoverflow.com/questions/3290182/rest-http-status-codes-for-failed-validation-or-invalid-duplicate",
status: 200,
isRedirect: false
}]
type: "object",
name: "redirectChain",
isArray: true
}
allowedInRobotsTxt
{
value: {
isAllowed: true,
matchedAtLine: 68
},
type: "object",
name: "allowedInRobotsTxt",
isArray: false
}
If you like to read how each metric is calculated please refer to the code documentation.
- TypeScript - JavaScript that scales
- Puppeteer - Headless Chrome Node.js API
- cheerio - jQuery designed specifically for the server
This project is licensed under the MIT License - see the LICENSE.md file for details
- Alec Bertram - Reformed SEO and born-again product person