Skip to content
The Public API is available on request. Email support@grona.ai to get access.

Check whether the Grona snippet is on a page

POST
/v1/websites/verify-script
curl --request POST \
--url https://api.grona.ai/v1/websites/verify-script \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "url": "https://shop.example.com/" }'

Loads the page at url and looks for your workspace’s Grona snippet on it. The call waits for the check, so the result is always present or absent, never checking or unknown. absent also covers a page Grona could not load.

The check covers the one page you send, not the whole site. For how Grona matches a URL to your website, and for the cases that read absent even though the snippet is installed, see Verify installations.

Media typeapplication/json
object
url
required

An http or https page URL.

string format: uri

Example

{
"url": "https://shop.example.com/"
}

The result of the check.

Media typeapplication/json
object
data
required
object
url
required

The page that was checked.

string format: uri
script
required
object
status
required

absent also covers a page Grona could not load.

string
Allowed values: present absent
checkedAt
required

ISO 8601 in UTC, with millisecond precision.

string format: date-time
meta
required
object
workspaceId
required

The workspace resolved from the secret key.

string

Examples

Snippet found

{
"data": {
"url": "https://shop.example.com/",
"script": {
"status": "present",
"checkedAt": "2026-10-20T09:28:43.162Z"
}
},
"meta": {
"workspaceId": "65e8a1c47d2f9b03e6a15c42"
}
}

url is missing or is not an http or https URL. error.code is invalid_request.

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable. Branch on this, and on the HTTP status for codes you do not know.

string
Allowed values: invalid_request unauthorized not_found conflict internal_error
message
required

Human-readable. The wording can change, so do not parse it.

string

Example

{
"error": {
"code": "invalid_request",
"message": "`url` must be an http or https URL."
}
}

The secret key is missing, malformed, unknown or revoked. error.code is unauthorized.

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable. Branch on this, and on the HTTP status for codes you do not know.

string
Allowed values: invalid_request unauthorized not_found conflict internal_error
message
required

Human-readable. The wording can change, so do not parse it.

string

Example

{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key."
}
}

Too many requests. Retry with exponential backoff and jitter, and wait at least as long as Retry-After when it is present. Branch on the status code; the body is not guaranteed to use the error envelope.

Retry-After
string

How long to wait before retrying, in seconds or as an HTTP date.

Unexpected server error. error.code is internal_error. Retry with backoff; if it persists, contact support@grona.ai with the time of the request and the endpoint.

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable. Branch on this, and on the HTTP status for codes you do not know.

string
Allowed values: invalid_request unauthorized not_found conflict internal_error
message
required

Human-readable. The wording can change, so do not parse it.

string

Example

{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side."
}
}

Temporarily unavailable. Retry with exponential backoff and jitter, and wait at least as long as Retry-After when it is present. Branch on the status code; the body is not guaranteed to use the error envelope.

Retry-After
string

How long to wait before retrying, in seconds or as an HTTP date.