Skip to content

Get the logo and icons from the website

POST
/status-pages/{id}/brand-from-website
curl --request POST \
--url https://dev.tunnelhq.com/api/v1/status-pages/sp_12/brand-from-website \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <X-API-Key>' \
--header 'X-Project-Id: prj_12' \
--data '{ "use": [ "logo", "logo_dark", "favicon" ] }'

Reads the page’s website_url and saves what you ask for in use from what it finds. Left out, use takes everything found. Send [] to only see what the site offers.

  • logo: the mark in the site’s header, the link to its home page. An SVG drawn in the text colour also gives logo_dark, in the page’s dark text colour. With no mark there, the site’s Apple touch icon.
  • favicon: the site’s icon, an SVG first, then the largest PNG, then /favicon.ico.
  • share_image: the site’s og:image (or twitter:image), as a PNG or JPEG.

Each picture is held to the same types and sizes as one you send yourself. A new logo hands logo_with_name back to the logo’s shape. A page can fetch once every 10 seconds. It needs a role that can edit the project (Owner, Admin and Manager have it by default).

Need an API key? See Getting an API key.

id
required
string

The page’s id (sp_12), from List status pages. The bare number (12) works too.

Example
sp_12
X-Project-Id
required
string

The project, as prj_12 or 12. A workspace key can only reach its own workspace’s projects.

Example
prj_12
Media typeapplication/json
object
use

What to save from what is found. Left out, everything found.

Array<string>
Allowed values: logo logo_dark favicon share_image
Example
{
"use": [
"logo",
"logo_dark",
"favicon"
]
}

What the website offers, what was saved, and the page.

Media typeapplication/json
object
source
required

The website’s host, without www..

string
found
required

Which pictures the website offers.

object
logo
required
boolean
logo_dark
required
boolean
favicon
required
boolean
share_image
required
boolean
applied
required

What was saved on the page.

Array<string>
Allowed values: logo logo_dark favicon share_image
status_page
required
object
id
required
string
name
required
string
slug
required
string
address
required

The page’s own address, without https://.

string
url
required

Where visitors find the page. It uses the custom domain only when the page is published and domain_state is active.

string
published
required
boolean
published_at
required
string | null format: date-time
changes_pending
required

A published page has changes that wait for a publish.

boolean
custom_domain
required
string | null
domain_state
required
  • none: no custom domain is set.
  • waiting: set, but its record doesn’t point to TunnelHQ yet. domain_note says what the check found.
  • issuing: the record points here and the HTTPS certificate is being made.
  • active: live, with HTTPS.
  • failed: the certificate failed. domain_note says why.
string
Allowed values: none waiting issuing active failed
domain_note
required

What the last check found

string | null
dns_records
required

The record the custom domain needs, one CNAME to cname.tunnelhq.net; empty without a custom domain. For a bare domain it’s named @: add it as your DNS provider’s CNAME flattening, ALIAS or ANAME record.

Array<object>

The record a custom domain needs, named as DNS providers name it: relative to your zone, status for status.example.com and @ for example.com itself.

object
type
required
string
Allowed values: CNAME
name
required
string
value
required
string
private
required

Whether the page is behind a password.

boolean
website_url
string | null
contact_url
string | null
description
string | null
page_title
string | null
brand_color

Lowercase #rrggbb, or null.

string | null
/^#[0-9a-f]{6}$/
theme
string
Allowed values: auto light dark
header

logo: the logo and Subscribe. site: with Status, History and Maintenance tabs too.

string
Allowed values: logo site
layout

bars: 90 days of bars under each service. folded: one line each, bars on a click.

string
Allowed values: bars folded
show_past_incidents
boolean
logo_height
integer
Allowed values: 24 32 40 48
logo_with_name
required

Whether the name shows beside the logo now: your choice, or until you make one, the logo’s shape.

boolean
language
string
Allowed values: en fr de es pt-br nl pl sv ru tr fa ar zh-cn
languages

Other languages visitors can choose.

Array<string>
Allowed values: en fr de es pt-br nl pl sv ru tr fa ar zh-cn
search_visible
boolean
auto_incidents
boolean
monitoring_operational
boolean
templates

The text a new update starts with, for each status. Sending it replaces the whole set; a status left out is empty.

object
investigating
string
<= 1000 characters
identified
string
<= 1000 characters
monitoring
string
<= 1000 characters
resolved
string
<= 1000 characters
has_logo
boolean
has_dark_logo
boolean
has_favicon
boolean
has_share_image
boolean
service_count
required

Services as visitors see them, hidden ones included: a server’s tunnels on one host count once, a group counts its members.

integer
service_limit
required
integer
sections
required
Array<object>
object
id
required
integer
name
required

The section’s heading; empty for none.

string
services
required
Array<object>
object
id
required
string
monitor_id
required
string
name
required

The name shown on the page.

string
hidden
required

On the page’s setup, but not shown to visitors.

boolean
monitor_name
required

The monitor’s own name.

string
type
required

The monitor’s type, such as vpn, http or group.

string
protocol
required

A tunnel’s protocol, such as wireguard; null for other monitors.

string | null
services
required

A group’s members, one level deep. Empty for anything else.

Array<object>
object
key
additional properties
any
Example
{
"source": "larkspur.example",
"found": {
"logo": true,
"logo_dark": true,
"favicon": true,
"share_image": false
},
"applied": [
"logo",
"logo_dark",
"favicon"
],
"status_page": {
"id": "sp_12",
"name": "Larkspur VPN",
"website_url": "https://larkspur.example/",
"has_logo": true,
"has_dark_logo": true,
"has_favicon": true,
"has_share_image": false,
"logo_with_name": true
}
}
X-RateLimit-Limit
integer

Requests the workspace’s plan allows per minute.

X-RateLimit-Remaining
integer

Requests left in the current minute.

X-RateLimit-Reset
integer

Unix time, in seconds, when the current minute ends.

The page has no website, the website couldn’t be read, or use isn’t valid.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Examples
{
"error": true,
"code": 400,
"message": "Add the page's website under General first."
}

The API key is missing, wrong, expired, switched off, or no longer valid.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Examples
{
"error": true,
"code": 401,
"message": "API key is required. Provide X-API-Key header or Authorization: Bearer <key>"
}

The role can’t edit the project.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 403,
"message": "Changing status pages needs a role that can edit this project."
}

The project has no status page with this ID.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 404,
"message": "No such status page."
}

The page fetched its website less than 10 seconds ago, or the key is over its usage limit (see TooManyRequests).

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 429,
"message": "It was fetched a moment ago. Try again in a few seconds."
}

Something failed on TunnelHQ’s side.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 500,
"message": "Internal server error"
}