Non ancora tradotta
Questa pagina non è ancora disponibile nella sua lingua, perciò viene mostrata in inglese.
Endpoint reference¶
Every endpoint of the Hi, Moose API, contract version 1.2.1, generated from the same OpenAPI file the API serves at api.himoose.com/v1/openapi.json. That file imports into Postman, Insomnia, Bruno and code generators.
All requests go to https://api.himoose.com/v1 and carry the key as a Bearer token, see Keys and authentication. Responses are JSON. Errors use the Problem Details format described in Errors and limits. Lists return data and nextCursor, see Reading data.
Permissions: Read visibility data is on every key. Manage tracking and Start runs are chosen when the key is created.
Contents¶
- Account
- Describe the API key
GET /me
- Describe the API key
- Projects
- List projects the key can read
GET /projects - Get one project
GET /projects/{projectId}
- List projects the key can read
- Setup
- List the engines this project tracks
GET /projects/{projectId}/engines - List the topics that group the tracked prompts
GET /projects/{projectId}/topics - List the tracked prompts
GET /projects/{projectId}/prompts - List the tracked competitors
GET /projects/{projectId}/competitors
- List the engines this project tracks
- Results
- List visibility runs
GET /projects/{projectId}/runs - List stored answers
GET /projects/{projectId}/answers - Get one answer with its full text
GET /projects/{projectId}/answers/{answerId}
- List visibility runs
- Stats
- Mention and citation rates per day and engine
GET /projects/{projectId}/stats/daily - Share of voice for the brand and its tracked competitors
GET /projects/{projectId}/stats/competitors
- Mention and citation rates per day and engine
- Tracking
- Create a project
POST /projects - Change a project name, site address, brand terms or domains
PATCH /projects/{projectId} - Add a tracked prompt
POST /projects/{projectId}/prompts - Replace the tracked competitor list
PUT /projects/{projectId}/competitors - What this project can do on its plan
GET /projects/{projectId}/capabilities - Change a prompt
PATCH /projects/{projectId}/prompts/{promptId} - Stop tracking a prompt
DELETE /projects/{projectId}/prompts/{promptId} - Set engines, schedule and samples
PUT /projects/{projectId}/tracking
- Create a project
- Runs
- Start a visibility run
POST /projects/{projectId}/run-requests - Recent run requests
GET /projects/{projectId}/run-requests - Follow a run request
GET /projects/{projectId}/run-requests/{requestId}
- Start a visibility run
- Webhooks
- Register a webhook
POST /projects/{projectId}/webhooks - List webhooks
GET /projects/{projectId}/webhooks - Delete a webhook
DELETE /projects/{projectId}/webhooks/{webhookId} - Send a ping event now
POST /projects/{projectId}/webhooks/{webhookId}/test - Recent deliveries and their attempts
GET /projects/{projectId}/webhooks/{webhookId}/deliveries
- Register a webhook
Account¶
Who the key belongs to and what it can read.
Describe the API key¶
Permission: Read visibility data (every key)
Returns the key's label, permissions, expiry, the account plan and the project ids the key can read. A good first call to check a key.
Example
Responses
200 The key and its access.
| Field | Type | Required | Description |
|---|---|---|---|
keyId | string | yes | Short public id of the key, also shown in Settings. |
label | string | yes | The label given to the key when it was created. |
scopes | array of string: visibility:read, tracking:write, runs:execute | yes | The key's permissions. |
createdAt | string (RFC 3339 time) | yes | When the key was created. |
expiresAt | string (RFC 3339 time), or null | yes | When the key stops working, or null when it never expires. |
account | object | yes | The account the key belongs to. |
account.plan | string | yes | The plan code, for example free or premium. |
projects | array of string | yes | Project ids the key can read. |
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
429 The per-minute or per-day limit was reached.
Projects¶
Projects the key can read and what each one tracks.
List projects the key can read¶
Permission: Read visibility data (every key)
Lists the projects the key may read, newest first, with a summary of what each one tracks and when it last ran.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | The nextCursor value from the previous page. Opaque. |
limit | query | integer | no | Rows per page. Default 50, at most 200. Default 50. At most 200. |
Example
Responses
200 A page of projects.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The project id used in every project endpoint. |
data[].name | string | yes | The project name as shown in Hi, Moose. |
data[].websiteUrl | string (URL), or null | yes | The site address the project tracks. |
data[].visibility | object | yes | A summary of what the project tracks and when it last ran. |
data[].visibility.trackedPrompts | integer | yes | How many prompts are tracked. |
data[].visibility.engines | array of string | yes | Ids of the engines the project tracks by default. |
data[].visibility.latestRunAt | string (RFC 3339 time), or null | yes | When the latest run finished, or null when no run has completed yet. |
data[].visibility.firstAnswerDate | string (YYYY-MM-DD), or null | yes | The first day with stored answers, or null. |
data[].visibility.latestAnswerDate | string (YYYY-MM-DD), or null | yes | The most recent day with stored answers, or null. |
nextCursor | string, or null | yes | Pass as cursor to get the next page. Null on the last page. |
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
429 The per-minute or per-day limit was reached.
Get one project¶
Permission: Read visibility data (every key)
Returns one project with its tracking summary.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Example
Responses
200 The project.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The project id used in every project endpoint. |
name | string | yes | The project name as shown in Hi, Moose. |
websiteUrl | string (URL), or null | yes | The site address the project tracks. |
visibility | object | yes | A summary of what the project tracks and when it last ran. |
visibility.trackedPrompts | integer | yes | How many prompts are tracked. |
visibility.engines | array of string | yes | Ids of the engines the project tracks by default. |
visibility.latestRunAt | string (RFC 3339 time), or null | yes | When the latest run finished, or null when no run has completed yet. |
visibility.firstAnswerDate | string (YYYY-MM-DD), or null | yes | The first day with stored answers, or null. |
visibility.latestAnswerDate | string (YYYY-MM-DD), or null | yes | The most recent day with stored answers, or null. |
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
Setup¶
Engines, topics, prompts and tracked competitors for a project.
List the engines this project tracks¶
Permission: Read visibility data (every key)
Engines are the AI answer engines Hi, Moose asks, such as ChatGPT, Gemini, Perplexity, Grok, Claude and Google AI Mode. The id is stable and is what the engine filter takes elsewhere.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/engines \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The engine list. Not paginated; there are at most a few dozen.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | Stable engine id, for example chatgpt, gemini, perplexity, grok, claude, google-ai-mode. Local-fetch variants end in -local-fetch. |
data[].label | string | yes | Display name. |
data[].tracked | boolean | yes | Whether new runs ask this engine. Engines with stored answers but no longer tracked are listed with false. |
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
List the topics that group the tracked prompts¶
Permission: Read visibility data (every key)
Lists the topics that group the tracked prompts, with a prompt count each. Topic ids are the values to pass as topicId.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
cursor | query | string | no | The nextCursor value from the previous page. Opaque. |
limit | query | integer | no | Rows per page. Default 50, at most 200. Default 50. At most 200. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/topics \
-H "Authorization: Bearer hmk_live_..."
Responses
200 A page of topics.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The topic id to pass as topicId in filters and on prompts. |
data[].label | string | yes | The topic name as shown in Hi, Moose. |
data[].promptCount | integer | yes | How many tracked prompts belong to this topic. |
nextCursor | string, or null | yes | Pass as cursor to get the next page. Null on the last page. |
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
List the tracked prompts¶
Permission: Read visibility data (every key)
Lists the tracked prompts, newest first, with their topics, engines and status.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
topicId | query | string | no | Only prompts or answers in this topic. Ids come from the topics endpoint. |
status | query | string: active, paused | no | Only prompts with this status. Default is all. |
cursor | query | string | no | The nextCursor value from the previous page. Opaque. |
limit | query | integer | no | Rows per page. Default 50, at most 200. Default 50. At most 200. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/prompts \
-H "Authorization: Bearer hmk_live_..."
Responses
200 A page of prompts.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The prompt id used in the prompt endpoints and the promptId filter. |
data[].text | string | yes | The question the engines are asked. |
data[].topicIds | array of string | yes | Ids of the topics this prompt belongs to. |
data[].engineIds | array of string | yes | Ids of the engines that run this prompt. Empty means the prompt uses no engine and is skipped in runs. |
data[].status | string: active, paused | yes | active prompts run on schedule; paused prompts are kept but not run. |
data[].createdAt | string (RFC 3339 time), or null | yes | When the prompt was added. |
nextCursor | string, or null | yes | Pass as cursor to get the next page. Null on the last page. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
List the tracked competitors¶
Permission: Read visibility data (every key)
The competitor brands Hi, Moose looks for in every answer. Competitor stats use these names.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/competitors \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The competitor list. Not paginated; at most 50.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].name | string | yes | The competitor brand name as it is matched in answers. |
data[].domains | array of string | yes | Domains that count as this competitor being cited. |
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
Results¶
Runs and the stored answers from each engine.
List visibility runs¶
Permission: Read visibility data (every key)
A run is one pass over the tracked prompts on the tracked engines. Newest first.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
from | query | string (YYYY-MM-DD) | no | First day to include, YYYY-MM-DD, UTC. |
to | query | string (YYYY-MM-DD) | no | Last day to include, YYYY-MM-DD, UTC. Defaults to today. |
status | query | string: completed, running, failed, canceled | no | Only runs with this status. |
cursor | query | string | no | The nextCursor value from the previous page. Opaque. |
limit | query | integer | no | Rows per page. Default 50, at most 200. Default 50. At most 200. |
Example
Responses
200 A page of runs.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The run id to pass as runId on the answers endpoint. |
data[].status | string: completed, running, failed, canceled | yes | completed runs have all their answers stored. running runs are still collecting. failed and canceled runs may have partial answers. |
data[].trigger | string: scheduled, manual | yes | scheduled when the project schedule started it, manual when a person or the API started it. |
data[].startedAt | string (RFC 3339 time), or null | yes | When the run started. |
data[].completedAt | string (RFC 3339 time), or null | yes | When the run finished, or null while it is running. |
data[].promptCount | integer | yes | How many prompts the run covered. |
data[].answerCount | integer | yes | How many answers the run stored. |
nextCursor | string, or null | yes | Pass as cursor to get the next page. Null on the last page. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
List stored answers¶
Permission: Read visibility data (every key)
One answer is one engine's reply to one prompt on one date. Newest first. This list carries the excerpt, the mention and citation flags, the position, the sentiment, the competitors seen and the source URLs. The full answer text is on the detail endpoint. Date range defaults to the last 30 days. The widest range per request is 366 days.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
from | query | string (YYYY-MM-DD) | no | First day to include, YYYY-MM-DD, UTC. |
to | query | string (YYYY-MM-DD) | no | Last day to include, YYYY-MM-DD, UTC. Defaults to today. |
engine | query | array of string | no | Only this engine. Repeat the parameter for several engines. Values come from the engines endpoint. |
topicId | query | string | no | Only prompts or answers in this topic. Ids come from the topics endpoint. |
promptId | query | string | no | Only answers to this prompt. Ids come from the prompts endpoint. |
runId | query | string | no | Only answers from this run. Ids come from the runs endpoint or a webhook event. |
mentioned | query | boolean | no | Only answers where the brand was, or was not, mentioned. |
cited | query | boolean | no | Only answers where the brand's site was, or was not, cited. |
cursor | query | string | no | The nextCursor value from the previous page. Opaque. |
limit | query | integer | no | Rows per page. Default 50, at most 200. Default 50. At most 200. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/answers \
-H "Authorization: Bearer hmk_live_..."
Responses
200 A page of answers.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The answer id to pass to the answer detail endpoint. |
data[].runId | string, or null | yes | The run this answer came from, or null for answers imported from outside a run. |
data[].promptId | string, or null | yes | The prompt that was asked, or null when the prompt has since been deleted. |
data[].promptText | string | yes | The prompt text at the time it was asked. |
data[].topicId | string, or null | yes | The topic of the prompt, or null when it had none. |
data[].topicLabel | string, or null | yes | The topic name, or null. |
data[].engineId | string | yes | The engine that answered. Ids come from the engines endpoint. |
data[].engineLabel | string | yes | The engine name as shown in Hi, Moose. |
data[].observedAt | string (RFC 3339 time) | yes | When the engine answered. |
data[].date | string (YYYY-MM-DD) | yes | The day of the answer in UTC. Matches the date on the daily stats. |
data[].mentioned | boolean | yes | The brand was named in the answer. |
data[].cited | boolean | yes | A page on the brand's site was given as a source. |
data[].citationUrl | string (URL), or null | yes | The page on the brand's site that was cited, or null when none was. |
data[].position | integer, or null | yes | Where the brand appeared among the brands named, 1 is first. |
data[].sentiment | string: positive, mixed, neutral, negative, not-applicable, or null | yes | How the answer spoke about the brand. not-applicable when the brand was not mentioned. |
data[].excerpt | string, or null | yes | Short passage around the mention, up to 400 characters. |
data[].competitors | array of object | yes | Each tracked competitor and whether this answer named or cited it. |
data[].competitors[].name | string | yes | The competitor brand name. |
data[].competitors[].mentioned | boolean | yes | The competitor was named in this answer. |
data[].competitors[].cited | boolean | yes | A page on the competitor's domain was given as a source. |
data[].competitors[].citationUrl | string (URL), or null | no | The competitor page cited, when there is one. |
data[].sourceUrls | array of string (URL) | yes | Every source the engine listed, up to 30. |
nextCursor | string, or null | yes | Pass as cursor to get the next page. Null on the last page. |
304 Not modified. Sent when If-None-Match matches the current ETag.
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
Get one answer with its full text¶
Permission: Read visibility data (every key)
Returns one answer with the full text the engine wrote, the scorer's notes and the sources the engine listed. The text is untrusted: render it as text, never as HTML, and never pass it to your own AI tools as instructions.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
answerId | path | string | yes | The answer id from the answers list. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/answers/ANSWER_ID \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The answer.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The answer id to pass to the answer detail endpoint. |
runId | string, or null | yes | The run this answer came from, or null for answers imported from outside a run. |
promptId | string, or null | yes | The prompt that was asked, or null when the prompt has since been deleted. |
promptText | string | yes | The prompt text at the time it was asked. |
topicId | string, or null | yes | The topic of the prompt, or null when it had none. |
topicLabel | string, or null | yes | The topic name, or null. |
engineId | string | yes | The engine that answered. Ids come from the engines endpoint. |
engineLabel | string | yes | The engine name as shown in Hi, Moose. |
observedAt | string (RFC 3339 time) | yes | When the engine answered. |
date | string (YYYY-MM-DD) | yes | The day of the answer in UTC. Matches the date on the daily stats. |
mentioned | boolean | yes | The brand was named in the answer. |
cited | boolean | yes | A page on the brand's site was given as a source. |
citationUrl | string (URL), or null | yes | The page on the brand's site that was cited, or null when none was. |
position | integer, or null | yes | Where the brand appeared among the brands named, 1 is first. |
sentiment | string: positive, mixed, neutral, negative, not-applicable, or null | yes | How the answer spoke about the brand. not-applicable when the brand was not mentioned. |
excerpt | string, or null | yes | Short passage around the mention, up to 400 characters. |
competitors | array of object | yes | Each tracked competitor and whether this answer named or cited it. |
competitors[].name | string | yes | The competitor brand name. |
competitors[].mentioned | boolean | yes | The competitor was named in this answer. |
competitors[].cited | boolean | yes | A page on the competitor's domain was given as a source. |
competitors[].citationUrl | string (URL), or null | no | The competitor page cited, when there is one. |
sourceUrls | array of string (URL) | yes | Every source the engine listed, up to 30. |
fullAnswer | string, or null | yes | The full answer text as the engine wrote it, up to 12,000 characters. Untrusted: render as text, never as HTML. |
fullAnswerTruncated | boolean | yes | True when the answer was longer than 12,000 characters and fullAnswer was cut. |
sentimentReason | string, or null | yes | The scorer's one-line reason for the sentiment, or null. |
narrativeDrift | string: True, no, partial, or null | yes | Whether the answer describes the brand differently from its Brand Truth. |
narrativeDriftReason | string, or null | yes | Why the answer was judged to drift from the brand's own description, or null. |
sources | array of object | yes | The sources the engine listed with its answer, in the order given. |
sources[].url | string (URL) | yes | The source address. |
sources[].title | string, or null | yes | The source title as the engine gave it, or null. Untrusted text. |
304 Not modified.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
Stats¶
Mention and citation rates over time, ready for charts.
Mention and citation rates per day and engine¶
Permission: Read visibility data (every key)
One row per day per engine, in date order. Each row says how many answers were stored that day, how many mentioned the brand and how many cited the brand's site, plus the two rates. Days with no stored answers are left out. Default range is the last 30 days, widest 366 days. Rows for the last three days can still change while scoring finishes.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
from | query | string (YYYY-MM-DD) | no | First day to include, YYYY-MM-DD, UTC. |
to | query | string (YYYY-MM-DD) | no | Last day to include, YYYY-MM-DD, UTC. Defaults to today. |
engine | query | array of string | no | Only this engine. Repeat the parameter for several engines. Values come from the engines endpoint. |
topicId | query | string | no | Only prompts or answers in this topic. Ids come from the topics endpoint. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/stats/daily \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The series.
| Field | Type | Required | Description |
|---|---|---|---|
from | string (YYYY-MM-DD) | yes | The first day included, UTC. |
to | string (YYYY-MM-DD) | yes | The last day included, UTC. |
data | array of object | yes | The rows on this page. |
data[].date | string (YYYY-MM-DD) | yes | The day in UTC. |
data[].engineId | string | yes | The engine these numbers are for. |
data[].answers | integer | yes | How many answers were stored that day for this engine. |
data[].mentioned | integer | yes | How many of those answers named the brand. |
data[].cited | integer | yes | How many of those answers cited a page on the brand's site. |
data[].mentionRate | number, or null | yes | mentioned divided by answers, 0 to 1. |
data[].citationRate | number, or null | yes | cited divided by answers, 0 to 1. |
incompleteDays | integer | yes | Days in the range whose summary was not ready yet. Zero means the series is complete. When above zero, call again in a few seconds. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
Share of voice for the brand and its tracked competitors¶
Permission: Read visibility data (every key)
For the range, one row per brand name (the project's own brand first, then each tracked competitor) with how many answers mentioned it, how many cited it, and the rates. With engine given, only that engine's answers count.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
from | query | string (YYYY-MM-DD) | no | First day to include, YYYY-MM-DD, UTC. |
to | query | string (YYYY-MM-DD) | no | Last day to include, YYYY-MM-DD, UTC. Defaults to today. |
engine | query | array of string | no | Only this engine. Repeat the parameter for several engines. Values come from the engines endpoint. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/stats/competitors \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The share of voice table.
| Field | Type | Required | Description |
|---|---|---|---|
from | string (YYYY-MM-DD) | yes | The first day included, UTC. |
to | string (YYYY-MM-DD) | yes | The last day included, UTC. |
answers | integer | yes | Answers counted in the range. |
data | array of object | yes | The rows on this page. |
data[].name | string | yes | The brand or competitor name. |
data[].isOwnBrand | boolean | yes | True on the row for the project's own brand. |
data[].mentioned | integer | yes | How many answers in the range named this brand. |
data[].cited | integer | yes | How many answers in the range cited this brand's site. |
data[].mentionRate | number, or null | yes | mentioned divided by all answers in the range, 0 to 1. |
data[].citationRate | number, or null | yes | cited divided by all answers in the range, 0 to 1. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
429 The per-minute or per-day limit was reached.
Tracking¶
Create projects and manage what Hi, Moose tracks. Needs the tracking:write permission.
Create a project¶
Permission: Manage tracking
Creates a project with a name and site address. The site crawl is not started; the host computer turns on the weekly scheduled crawl so it happens later. If another project on the account has a host device, the new project uses the same one. Brand Truth is not required.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | The project name, shown in Hi, Moose. At most 120 characters. |
websiteUrl | string (URL) | yes | The site address to track, with https. |
brandTerms | array of string | no | Other names the brand goes by, counted as mentions. At most 20 items. |
brandDomains | array of string | no | Other domains that count as the brand being cited. At most 20 items. |
Example
curl -X POST https://api.himoose.com/v1/projects \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"name": "Acme", "websiteUrl": "https://example.com/page"}'
Responses
201 The new project.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The project id used in every project endpoint. |
name | string | yes | The project name as shown in Hi, Moose. |
websiteUrl | string (URL), or null | yes | The site address the project tracks. |
visibility | object | yes | A summary of what the project tracks and when it last ran. |
visibility.trackedPrompts | integer | yes | How many prompts are tracked. |
visibility.engines | array of string | yes | Ids of the engines the project tracks by default. |
visibility.latestRunAt | string (RFC 3339 time), or null | yes | When the latest run finished, or null when no run has completed yet. |
visibility.firstAnswerDate | string (YYYY-MM-DD), or null | yes | The first day with stored answers, or null. |
visibility.latestAnswerDate | string (YYYY-MM-DD), or null | yes | The most recent day with stored answers, or null. |
host | object | no | The project's host computer. |
host.configured | boolean | yes | A host device is chosen for the project in Hi, Moose under Settings, Hi, Moose MCP. |
host.online | boolean | yes | True when the host computer has checked in within the last few minutes. |
host.deviceLabel | string, or null | yes | The name of the host computer as shown in Hi, Moose. |
host.lastSeenAt | string (RFC 3339 time), or null | yes | When the host computer last checked in, or null when it never has. |
warning | string, or null | no | A note about something to finish in Hi, Moose, for example that no host computer could be copied from another project. Null when there is nothing to do. |
brandTerms | array of string | no | Other names the brand goes by, counted as mentions. |
brandDomains | array of string | no | Other domains that count as the brand being cited. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Change a project name, site address, brand terms or domains¶
Permission: Manage tracking
Changes only the fields sent. Brand terms and brand domains replace the whole list when sent. The site crawl is not touched.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | no | A new project name. |
websiteUrl | string (URL) | no | A new site address, with https. |
brandTerms | array of string | no | Replaces the list of other names the brand goes by. |
brandDomains | array of string | no | Replaces the list of other domains that count as the brand being cited. |
Example
curl -X PATCH https://api.himoose.com/v1/projects/PROJECT_ID \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"name": "Acme"}'
Responses
200 The resource.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The project id used in every project endpoint. |
name | string | yes | The project name as shown in Hi, Moose. |
websiteUrl | string (URL), or null | yes | The site address the project tracks. |
visibility | object | yes | A summary of what the project tracks and when it last ran. |
visibility.trackedPrompts | integer | yes | How many prompts are tracked. |
visibility.engines | array of string | yes | Ids of the engines the project tracks by default. |
visibility.latestRunAt | string (RFC 3339 time), or null | yes | When the latest run finished, or null when no run has completed yet. |
visibility.firstAnswerDate | string (YYYY-MM-DD), or null | yes | The first day with stored answers, or null. |
visibility.latestAnswerDate | string (YYYY-MM-DD), or null | yes | The most recent day with stored answers, or null. |
host | object | no | The project's host computer. |
host.configured | boolean | yes | A host device is chosen for the project in Hi, Moose under Settings, Hi, Moose MCP. |
host.online | boolean | yes | True when the host computer has checked in within the last few minutes. |
host.deviceLabel | string, or null | yes | The name of the host computer as shown in Hi, Moose. |
host.lastSeenAt | string (RFC 3339 time), or null | yes | When the host computer last checked in, or null when it never has. |
warning | string, or null | no | A note about something to finish in Hi, Moose, for example that no host computer could be copied from another project. Null when there is nothing to do. |
brandTerms | array of string | no | Other names the brand goes by, counted as mentions. |
brandDomains | array of string | no | Other domains that count as the brand being cited. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Add a tracked prompt¶
Permission: Manage tracking
Engine ids default to the project tracking engines. Duplicate text is refused with 409.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
text | string | yes | The question to ask the engines. At most 500 characters. |
topicIds | array of string | no | Topic ids from the topics endpoint. A new id creates the topic. At most 20 items. |
engineIds | array of string | no | Defaults to the project tracking engines. |
Example
curl -X POST https://api.himoose.com/v1/projects/PROJECT_ID/prompts \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"text": "What are the best SAST tools?", "topicIds": ["string"], "engineIds": ["string"]}'
Responses
201 The new prompt.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The prompt id used in the prompt endpoints and the promptId filter. |
text | string | yes | The question the engines are asked. |
topicIds | array of string | yes | Ids of the topics this prompt belongs to. |
engineIds | array of string | yes | Ids of the engines that run this prompt. Empty means the prompt uses no engine and is skipped in runs. |
status | string: active, paused | yes | active prompts run on schedule; paused prompts are kept but not run. |
createdAt | string (RFC 3339 time), or null | yes | When the prompt was added. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Replace the tracked competitor list¶
Permission: Manage tracking
Replaces the whole list. At most 50. Names are matched case-insensitively.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Request body
The body is a JSON array. At most 50 items. Each item:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | The competitor brand name as it should be matched in answers. At most 120 characters. |
domain | string, or null | no | The competitor's site, so citations of it are counted. Optional. |
Example
curl -X PUT https://api.himoose.com/v1/projects/PROJECT_ID/competitors \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '[{"name": "Acme", "domain": "example.com"}]'
Responses
200 The saved list.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].name | string | yes | The competitor brand name as it is matched in answers. |
data[].domains | array of string | yes | Domains that count as this competitor being cited. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
What this project can do on its plan¶
Permission: Read visibility data (every key)
Allowed engines and cadences, prompt and project limits, remaining allowance with the estimated cost of one run, the host computer status, and whether a run can start right now.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/capabilities \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The resource.
| Field | Type | Required | Description |
|---|---|---|---|
plan | string | yes | The account plan code. |
accessMode | string: managed, byok-local | yes | managed means Hi, Moose runs the cloud engines and tracking settings live in the cloud. byok-local means the account brings its own keys and tracking settings live on the host computer. |
engines | array of object | yes | Every engine the plan allows, tracked or not. |
engines[].id | string | no | The engine id to use in engineIds and filters. |
engines[].label | string | no | The engine name as shown in Hi, Moose. |
engines[].runsOn | string: cloud, host | no | cloud engines run in the cloud; host engines run on the host computer through a browser. |
cadences | array of string | yes | The schedule cadences the plan allows. |
limits | object | yes | The plan's limits. Writes over a limit answer 409 plan_limit. |
limits.maxPrompts | integer, or null | no | The most prompts one project may track. |
limits.maxProjects | integer, or null | no | The most projects the account may have. |
limits.maxCompetitors | integer | no | The most competitors one project may track. |
limits.maxSamplesPerPrompt | integer | no | The highest samplesPerPrompt the plan allows. |
limits.runRequestsPerDay | integer | no | How many run requests one project may make per day through the API. |
allowance | object, or null | yes | Null on bring-your-own-key plans. |
allowance.remainingUnits | integer, or null | no | Allowance units left in the current period, or null when the plan has no period. |
allowance.prepaidCreditsRemaining | integer | no | Prepaid credit units that are spent after the period allowance runs out. |
allowance.periodEndsAt | string (RFC 3339 time), or null | no | When the current allowance period resets, or null. |
allowance.estimatedUnitsPerRun | integer | no | The estimated cost of one run with one sample per prompt, from the current prompts and engines. |
tracking | object | yes | The project's current tracking settings. |
tracking.engineIds | array of string | no | The default engines for new prompts. |
tracking.cadence | string | no | How often the schedule runs. |
tracking.timeOfDay | string | no | When the scheduled run starts, HH:MM in the project timezone. |
tracking.weeklyDay | string | no | The day a weekly schedule runs on. |
tracking.timezone | string | no | The IANA timezone the schedule uses. |
tracking.samplesPerPrompt | integer | no | How many times each prompt is asked per engine in a run. |
tracking.promptCount | integer | no | How many prompts the project tracks. |
tracking.writable | boolean | no | False on bring-your-own-key plans, where tracking settings live on the host computer. |
host | object | yes | The project's host computer, or null when none is chosen. |
host.configured | boolean | yes | A host device is chosen for the project in Hi, Moose under Settings, Hi, Moose MCP. |
host.online | boolean | yes | True when the host computer has checked in within the last few minutes. |
host.deviceLabel | string, or null | yes | The name of the host computer as shown in Hi, Moose. |
host.lastSeenAt | string (RFC 3339 time), or null | yes | When the host computer last checked in, or null when it never has. |
host.required | boolean | no | True when any tracked engine is a local-fetch engine or the plan is bring-your-own-key. |
runs | object | yes | Whether a run can start right now and why not. |
runs.canStartCloudRun | boolean | no | True when a cloud run could start now: engines, allowance and no active request. |
runs.canStartHostRun | boolean | no | True when a host run could start now: a host computer is chosen and no request is active. |
runs.hostOnline | boolean | no | True when the host computer is checked in. |
runs.activeRequestId | string, or null | no | The id of the run request that is queued, waiting or running, or null. |
runs.usedToday | integer | no | How many run requests the project has made today. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Change a prompt¶
Permission: Manage tracking
Only the fields sent change. status can only be active; delete a prompt to stop tracking it.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
promptId | path | string | yes | The prompt id from the prompts list. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
text | string | no | New text for the prompt. At most 500 characters. |
topicIds | array of string | no | Replaces the prompt's topics. |
engineIds | array of string | no | Replaces the engines that run this prompt. |
status | string: active | no | Send active to resume a prompt that was paused in Hi, Moose. |
Example
curl -X PATCH https://api.himoose.com/v1/projects/PROJECT_ID/prompts/PROMPT_ID \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"text": "What are the best SAST tools?"}'
Responses
200 The resource.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The prompt id used in the prompt endpoints and the promptId filter. |
text | string | yes | The question the engines are asked. |
topicIds | array of string | yes | Ids of the topics this prompt belongs to. |
engineIds | array of string | yes | Ids of the engines that run this prompt. Empty means the prompt uses no engine and is skipped in runs. |
status | string: active, paused | yes | active prompts run on schedule; paused prompts are kept but not run. |
createdAt | string (RFC 3339 time), or null | yes | When the prompt was added. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Stop tracking a prompt¶
Permission: Manage tracking
Removes the prompt from tracking. Stored answers for it are kept and stay readable on the answers endpoint.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
promptId | path | string | yes | The prompt id from the prompts list. |
Example
curl -X DELETE https://api.himoose.com/v1/projects/PROJECT_ID/prompts/PROMPT_ID \
-H "Authorization: Bearer hmk_live_..."
Responses
200 Deleted.
| Field | Type | Required | Description |
|---|---|---|---|
deleted | boolean | no | True when the item was removed. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Set engines, schedule and samples¶
Permission: Manage tracking
Only the fields sent change. engineIds sets the default engines for new prompts. Existing prompts keep their own engines unless applyEnginesToPrompts is true. The host computer picks the new schedule up within a minute while it is open, or when it next opens.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
engineIds | array of string | no | The default engines for new prompts. Ids come from the capabilities endpoint. |
applyEnginesToPrompts | boolean | no | Send true to also set engineIds on every existing prompt. Left out or false, existing prompts keep their own engines and engineIds only becomes the default for new prompts. Default false. |
cadence | string: manual, daily, weekdays, weekly | no | How often the schedule runs. manual turns the schedule off. |
timeOfDay | string | no | When the scheduled run starts, as HH:MM in the project timezone. |
weeklyDay | string: monday, tuesday, wednesday, thursday, friday, saturday, sunday | no | The day a weekly schedule runs on. |
timezone | string | no | An IANA timezone name such as Europe/Berlin, used for timeOfDay. |
samplesPerPrompt | integer | no | How many times each prompt is asked per engine in a run. More samples cost more allowance. |
Example
curl -X PUT https://api.himoose.com/v1/projects/PROJECT_ID/tracking \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"engineIds": ["string"]}'
Responses
200 The resource.
| Field | Type | Required | Description |
|---|---|---|---|
engineIds | array of string | yes | The default engines for new prompts. |
cadence | string | yes | How often the schedule runs. manual means the schedule is off. |
timeOfDay | string | yes | When the scheduled run starts, as HH:MM in the project timezone. |
weeklyDay | string | yes | The day a weekly schedule runs on. |
timezone | string | yes | The IANA timezone the schedule uses. |
samplesPerPrompt | integer | yes | How many times each prompt is asked per engine in a run. |
appliedToPrompts | integer | yes | How many prompts had their engines updated. |
host | object | yes | The project's host computer. |
host.configured | boolean | yes | A host device is chosen for the project in Hi, Moose under Settings, Hi, Moose MCP. |
host.online | boolean | yes | True when the host computer has checked in within the last few minutes. |
host.deviceLabel | string, or null | yes | The name of the host computer as shown in Hi, Moose. |
host.lastSeenAt | string (RFC 3339 time), or null | yes | When the host computer last checked in, or null when it never has. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Runs¶
Start visibility runs and follow them. Needs the runs:execute permission.
Start a visibility run¶
Permission: Start runs
Checks the allowance first and refuses with 409 insufficient_allowance when the estimate is above the remaining balance. One request at a time per project, at most 24 per project per day. Projects whose tracked engines are all cloud engines run in the cloud at once. Any local-fetch engine means the run is handed to the host computer; if that computer is off the request is accepted with a warning and waits up to 24 hours. Send an Idempotency-Key header to make retries safe for 24 hours.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Idempotency-Key | header | string | no | Any string up to 128 characters that identifies this attempt. A retry with the same key within 24 hours returns the earlier request instead of starting another run. |
Request body (optional)
| Field | Type | Required | Description |
|---|---|---|---|
samplesPerPrompt | integer | no | How many times to ask each prompt per engine in this run. Defaults to 1 and may not exceed the plan limit. Default 1. |
Example
curl -X POST https://api.himoose.com/v1/projects/PROJECT_ID/run-requests \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"samplesPerPrompt": 1}' \
-H "Idempotency-Key: nightly-2026-10-15"
Responses
200 Replayed from an earlier request with the same Idempotency-Key.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The run request id. Poll it on the run request endpoint. |
status | string: waiting_for_host, queued, running, completed, failed, canceled | yes | waiting_for_host means the host computer is off; Hi, Moose waits up to 24 hours. |
mode | string: cloud, host | yes | cloud when the run runs in the cloud, host when it was handed to the host computer. |
createdAt | string (RFC 3339 time), or null | yes | When the request was made. |
updatedAt | string (RFC 3339 time), or null | yes | When the status last changed. |
completedAt | string (RFC 3339 time), or null | yes | When the run finished, or null until then. |
runIds | array of string | yes | Run ids to pass to the runs and answers endpoints once completed. |
promptCount | integer | yes | How many prompts the run covers. |
estimatedUnits | integer | yes | The estimated allowance cost. 0 for host-only runs and bring-your-own-key plans. |
warning | string, or null | yes | A note about the request, for example that the host computer is off, or null. |
error | object, or null | yes | Why the request failed, or null. |
error.code | string | no | A stable code such as host_unavailable. |
error.message | string | no | What happened, in plain words. |
host | object, or null | yes | The host computer handling the run, or null for cloud runs. |
host.online | boolean | no | True when the host computer is checked in. |
host.lastSeenAt | string (RFC 3339 time), or null | no | When the host computer last checked in, or null. |
replayed | boolean | no | Present and true when an Idempotency-Key matched an earlier request. |
202 Accepted. Poll the Location header. Same fields as the 200 response.
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Recent run requests¶
Permission: Read visibility data (every key)
Lists run requests made through the API, newest first, with their current status.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
limit | query | integer | no | Rows per page. Default 50, at most 200. Default 50. At most 200. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/run-requests \
-H "Authorization: Bearer hmk_live_..."
Responses
200 Newest first.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The run request id. Poll it on the run request endpoint. |
data[].status | string: waiting_for_host, queued, running, completed, failed, canceled | yes | waiting_for_host means the host computer is off; Hi, Moose waits up to 24 hours. |
data[].mode | string: cloud, host | yes | cloud when the run runs in the cloud, host when it was handed to the host computer. |
data[].createdAt | string (RFC 3339 time), or null | yes | When the request was made. |
data[].updatedAt | string (RFC 3339 time), or null | yes | When the status last changed. |
data[].completedAt | string (RFC 3339 time), or null | yes | When the run finished, or null until then. |
data[].runIds | array of string | yes | Run ids to pass to the runs and answers endpoints once completed. |
data[].promptCount | integer | yes | How many prompts the run covers. |
data[].estimatedUnits | integer | yes | The estimated allowance cost. 0 for host-only runs and bring-your-own-key plans. |
data[].warning | string, or null | yes | A note about the request, for example that the host computer is off, or null. |
data[].error | object, or null | yes | Why the request failed, or null. |
data[].error.code | string | no | A stable code such as host_unavailable. |
data[].error.message | string | no | What happened, in plain words. |
data[].host | object, or null | yes | The host computer handling the run, or null for cloud runs. |
data[].host.online | boolean | no | True when the host computer is checked in. |
data[].host.lastSeenAt | string (RFC 3339 time), or null | no | When the host computer last checked in, or null. |
data[].replayed | boolean | no | Present and true when an Idempotency-Key matched an earlier request. |
nextCursor | string, or null | no | Pass as cursor to get the next page. Null on the last page. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Follow a run request¶
Permission: Read visibility data (every key)
Returns one run request with its current status, run ids once completed, and the host computer state for host runs. Poll it about once a minute.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
requestId | path | string | yes | The run request id from the 202 response or its Location header. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/run-requests/REQUEST_ID \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The resource.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The run request id. Poll it on the run request endpoint. |
status | string: waiting_for_host, queued, running, completed, failed, canceled | yes | waiting_for_host means the host computer is off; Hi, Moose waits up to 24 hours. |
mode | string: cloud, host | yes | cloud when the run runs in the cloud, host when it was handed to the host computer. |
createdAt | string (RFC 3339 time), or null | yes | When the request was made. |
updatedAt | string (RFC 3339 time), or null | yes | When the status last changed. |
completedAt | string (RFC 3339 time), or null | yes | When the run finished, or null until then. |
runIds | array of string | yes | Run ids to pass to the runs and answers endpoints once completed. |
promptCount | integer | yes | How many prompts the run covers. |
estimatedUnits | integer | yes | The estimated allowance cost. 0 for host-only runs and bring-your-own-key plans. |
warning | string, or null | yes | A note about the request, for example that the host computer is off, or null. |
error | object, or null | yes | Why the request failed, or null. |
error.code | string | no | A stable code such as host_unavailable. |
error.message | string | no | What happened, in plain words. |
host | object, or null | yes | The host computer handling the run, or null for cloud runs. |
host.online | boolean | no | True when the host computer is checked in. |
host.lastSeenAt | string (RFC 3339 time), or null | no | When the host computer last checked in, or null. |
replayed | boolean | no | Present and true when an Idempotency-Key matched an earlier request. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Webhooks¶
Get a signed HTTP call when a run finishes. Managing webhooks needs the tracking:write permission.
Register a webhook¶
Permission: Manage tracking
Up to 5 per project. The url must be public https. The signing secret is returned once in this response and never again. Default events are run.completed and run.failed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string (URL) | yes | Public https endpoint. Private and local addresses are refused. |
events | array of string: run.completed, run.failed | no | Defaults to both. |
description | string | no | A note to tell webhooks apart in Settings. Optional. At most 120 characters. |
Example
curl -X POST https://api.himoose.com/v1/projects/PROJECT_ID/webhooks \
-H "Authorization: Bearer hmk_live_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/page", "events": ["run.completed"], "description": "Nightly dashboard refresh"}'
Responses
201 The webhook with its signing secret.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The webhook id used in the webhook endpoints. |
url | string (URL) | yes | The endpoint Hi, Moose posts events to. |
events | array of string | yes | The events this webhook receives. |
description | string, or null | yes | The note given when the webhook was registered, or null. |
active | boolean | yes | Turned off automatically after 20 consecutive failed deliveries. Delete and register again to resume. |
createdAt | string (RFC 3339 time), or null | yes | When the webhook was registered. |
lastDeliveryAt | string (RFC 3339 time), or null | yes | When the last delivery was attempted, or null before the first. |
lastDeliveryStatus | string: delivered, failed, or null | yes | How the last delivery ended, or null before the first. |
consecutiveFailures | integer | yes | Failed deliveries in a row. At 20 the webhook is turned off. |
secret | string | yes | Signing secret, starts with whsec_. Shown once. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
List webhooks¶
Permission: Read visibility data (every key)
Lists the project's webhooks without their signing secrets.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/webhooks \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The webhooks, without secrets.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The webhook id used in the webhook endpoints. |
data[].url | string (URL) | yes | The endpoint Hi, Moose posts events to. |
data[].events | array of string | yes | The events this webhook receives. |
data[].description | string, or null | yes | The note given when the webhook was registered, or null. |
data[].active | boolean | yes | Turned off automatically after 20 consecutive failed deliveries. Delete and register again to resume. |
data[].createdAt | string (RFC 3339 time), or null | yes | When the webhook was registered. |
data[].lastDeliveryAt | string (RFC 3339 time), or null | yes | When the last delivery was attempted, or null before the first. |
data[].lastDeliveryStatus | string: delivered, failed, or null | yes | How the last delivery ended, or null before the first. |
data[].consecutiveFailures | integer | yes | Failed deliveries in a row. At 20 the webhook is turned off. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Delete a webhook¶
Permission: Manage tracking
Removes the webhook. Pending deliveries are dropped.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
webhookId | path | string | yes | The webhook id from the webhooks list. |
Example
curl -X DELETE https://api.himoose.com/v1/projects/PROJECT_ID/webhooks/WEBHOOK_ID \
-H "Authorization: Bearer hmk_live_..."
Responses
200 Deleted.
| Field | Type | Required | Description |
|---|---|---|---|
deleted | boolean | no | True when the item was removed. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Send a ping event now¶
Permission: Manage tracking
Posts a signed ping event so you can check your endpoint and signature code. The response shows the first attempt.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
webhookId | path | string | yes | The webhook id from the webhooks list. |
Example
curl -X POST https://api.himoose.com/v1/projects/PROJECT_ID/webhooks/WEBHOOK_ID/test \
-H "Authorization: Bearer hmk_live_..."
Responses
200 The ping delivery after its first attempt.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | The delivery id, also sent as the X-HiMoose-Delivery header. |
event | string: run.completed, run.failed, ping | yes | The event that was delivered. |
status | string: pending, delivered, failed | yes | pending while retries remain, delivered on a 2xx answer, failed after the last attempt. |
runId | string, or null | yes | The run the event is about, or null for a ping. |
requestId | string, or null | yes | The API run request that started the run, or null. |
createdAt | string (RFC 3339 time), or null | yes | When the event was created. |
deliveredAt | string (RFC 3339 time), or null | yes | When the endpoint answered 2xx, or null. |
nextAttemptAt | string (RFC 3339 time), or null | yes | When the next retry is due, or null when none is planned. |
attemptCount | integer | yes | How many attempts have been made so far. |
attempts | array of object | yes | Every attempt, oldest first. |
attempts[].at | string (RFC 3339 time) | no | When the attempt was made. |
attempts[].httpStatus | integer, or null | no | The status the endpoint answered, or null when it did not answer. |
attempts[].error | string, or null | no | Why the attempt failed, or null. |
attempts[].durationMs | integer | no | How long the endpoint took to answer, in milliseconds. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Recent deliveries and their attempts¶
Permission: Read visibility data (every key)
Lists the last 50 deliveries for the webhook, newest first, each with every attempt, its HTTP status and error.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
projectId | path | string | yes | The project id from the projects endpoint. |
webhookId | path | string | yes | The webhook id from the webhooks list. |
Example
curl https://api.himoose.com/v1/projects/PROJECT_ID/webhooks/WEBHOOK_ID/deliveries \
-H "Authorization: Bearer hmk_live_..."
Responses
200 Newest first, up to 50.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of object | yes | The rows on this page. |
data[].id | string | yes | The delivery id, also sent as the X-HiMoose-Delivery header. |
data[].event | string: run.completed, run.failed, ping | yes | The event that was delivered. |
data[].status | string: pending, delivered, failed | yes | pending while retries remain, delivered on a 2xx answer, failed after the last attempt. |
data[].runId | string, or null | yes | The run the event is about, or null for a ping. |
data[].requestId | string, or null | yes | The API run request that started the run, or null. |
data[].createdAt | string (RFC 3339 time), or null | yes | When the event was created. |
data[].deliveredAt | string (RFC 3339 time), or null | yes | When the endpoint answered 2xx, or null. |
data[].nextAttemptAt | string (RFC 3339 time), or null | yes | When the next retry is due, or null when none is planned. |
data[].attemptCount | integer | yes | How many attempts have been made so far. |
data[].attempts | array of object | yes | Every attempt, oldest first. |
data[].attempts[].at | string (RFC 3339 time) | no | When the attempt was made. |
data[].attempts[].httpStatus | integer, or null | no | The status the endpoint answered, or null when it did not answer. |
data[].attempts[].error | string, or null | no | Why the attempt failed, or null. |
data[].attempts[].durationMs | integer | no | How long the endpoint took to answer, in milliseconds. |
nextCursor | string, or null | no | Pass as cursor to get the next page. Null on the last page. |
400 A parameter is missing or malformed.
401 The key is missing, malformed, revoked or expired.
403 The account plan does not include the API, or the key lacks the scope.
404 No such resource, or the key cannot read it. The two cases are not told apart.
409 The request is valid but cannot be done right now. The code says why.
429 The per-minute or per-day limit was reached.
Webhook event payload¶
The JSON body Hi, Moose posts to a webhook endpoint. See Webhooks for signing and delivery rules.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | Unique event id. Use it to ignore repeats. |
event | string: run.completed, run.failed, ping | yes | The event name. |
createdAt | string (RFC 3339 time) | yes | When the event was created. |
data | object | yes | The event details. |
data.projectId | string | no | The project the run belongs to. |
data.runId | string, or null | no | The run id to pass as runId on the answers endpoint. |
data.requestId | string, or null | no | The API run request that started this run, when there was one. |
data.status | string | no | completed, failed or canceled. |
data.trigger | string | no | scheduled or manual. |
data.startedAt | string (RFC 3339 time), or null | no | When the run started. |
data.completedAt | string (RFC 3339 time), or null | no | When the run finished. |
data.promptCount | integer | no | How many prompts the run covered. |
data.answerCount | integer | no | How many answers the run stored. |
data.error | string, or null | no | Why the run failed, or null. |
data.links | object | no | Ready-made API addresses for the run's data. |
data.links.run | string (URL) | no | The runs endpoint for the project. |
data.links.answers | string (URL) | no | The answers endpoint filtered to this run. |
data.links.stats | string (URL) | no | The daily stats endpoint for the project. |