Account API
The Account API gives agencies and resellers full programmatic control over
their helloIMG account: create, rename, and delete websites, mint and revoke
the himg_live_ keys each website uses, and read usage — all without
touching the dashboard.
Getting a key
Once your account has reseller status, account keys are minted from Settings → Account API → Create key in the helloIMG dashboard.
The full key — himg_acct_... — is shown once, at creation time. Store
it somewhere safe; helloIMG only ever keeps its hash and can't show it to
you again. Up to 10 active account keys per account — revoke one before
minting past that.
403 on any
key-creation call — see Errors.Authentication
Send the key as a bearer token on every request:
Authorization: Bearer himg_acct_xxxxxxxx_************
Base URL:
https://app.helloimg.io/portal/account
Requests are rate-limited to 10 requests/second (burst 20), both per
calling IP and per key — whichever limit you hit first answers 429.
Every error comes back as JSON:
{ "error": "..." }
Endpoints
Account
GET /me
curl https://app.helloimg.io/portal/account/me \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************"
{
"id": "3f9c1a2b-6d4e-4f8a-9c3b-1a2b3c4d5e6f",
"email": "[email protected]",
"plan": "reseller_ai",
"website_count": 12,
"key_count": 3
}
Websites
GET /websites
POST /websites
PATCH /websites/{id}
DELETE /websites/{id}
List:
curl https://app.helloimg.io/portal/account/websites \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************"
{
"websites": [
{
"id": "7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b",
"domain": "client-site.example.com",
"name": "Client Site",
"created_at": "2026-08-01T12:00:00Z",
"active_key_count": 1
}
]
}
Create:
curl -X POST https://app.helloimg.io/portal/account/websites \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************" \
-H "Content-Type: application/json" \
-d '{"domain":"client-site.example.com","name":"Client Site"}'
{
"id": "7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b",
"domain": "client-site.example.com",
"name": "Client Site"
}
name is optional. domain must look like a real hostname — at least one
dot, lowercase a-z0-9- labels, no more than 253 characters — or the call
answers 400. A domain already registered on your account answers 409
instead of creating a duplicate.
Rename:
curl -X PATCH https://app.helloimg.io/portal/account/websites/7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************" \
-H "Content-Type: application/json" \
-d '{"name":"New Client Name"}'
204 on success, no body. name is required on this call — omit it (or
send it as null) and you get a 400, unlike POST /websites where it's
optional.
Delete:
curl -X DELETE https://app.helloimg.io/portal/account/websites/7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************"
204 on success. Deleting a website revokes every one of its keys along
with it.
Website keys
POST /websites/{id}/keys
GET /websites/{id}/keys
DELETE /websites/{id}/keys/{prefix}
Mint:
curl -X POST https://app.helloimg.io/portal/account/websites/7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b/keys \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************" \
-H "Content-Type: application/json" \
-d '{"name":"Production"}'
{
"id": "2b9e4f7a-1d3c-4a6b-8f0e-9c8d7e6f5a4b",
"name": "Production",
"prefix": "h4k2x9mq",
"key": "himg_live_h4k2x9mq_************************************"
}
name is optional. key is the full himg_live_ key — this is what you
configure in the LW Image WordPress
plugin on the client's site. It's shown once; only prefix is ever
retrievable afterwards. Max 2 active keys per website — 409 past
that, revoke one first.
List:
curl https://app.helloimg.io/portal/account/websites/7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b/keys \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************"
{
"keys": [
{
"id": "2b9e4f7a-1d3c-4a6b-8f0e-9c8d7e6f5a4b",
"name": "Production",
"prefix": "h4k2x9mq",
"created_at": "2026-08-01T12:00:00Z",
"last_used_at": "2026-08-20T09:14:32Z"
}
]
}
The secret is never returned after the mint response — only prefix.
Revoke:
curl -X DELETE https://app.helloimg.io/portal/account/websites/7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b/keys/h4k2x9mq \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************"
204 on success.
Usage
GET /usage
curl https://app.helloimg.io/portal/account/usage \
-H "Authorization: Bearer himg_acct_xxxxxxxx_************"
{
"plan": "reseller_ai",
"month": "2026-08",
"websites": [
{
"website_id": "7f3a1c92-6b4d-4e8f-9a21-5c6d7e8f9a0b",
"domain": "client-site.example.com",
"images": 4213,
"bytes_saved": 891234567,
"limit": -1,
"over_limit": false
}
]
}
Current calendar month, per website: images processed and bytes saved.
limit and over_limit are account-wide values repeated on every entry —
Reseller + AI carries no image cap, so limit is always -1.
Errors
| Status | Body | Cause |
|---|---|---|
400 | { "error": "invalid json" } | The request body isn't valid JSON, on POST /websites or POST /websites/{id}/keys. |
400 | { "error": "invalid domain" } | domain isn't a valid hostname shape on POST /websites — see Websites. |
400 | { "error": "name too long" } | name is over 200 characters, on a website or a key. |
400 | { "error": "name required" } | PATCH /websites/{id} was called without a name field (or the body wasn't valid JSON). |
401 | { "error": "invalid account key" } | Missing, malformed, unknown, or revoked bearer key. |
403 | { "error": "reseller plan required" } | The account isn't flagged as a reseller, or isn't on the Reseller + AI plan. |
403 | { "error": "email verification required" } | The account's email isn't verified yet — blocks minting a key on POST /websites/{id}/keys. |
404 | { "error": "not found" } | The website or key doesn't exist, or belongs to a different account. |
409 | { "error": "website already registered" } | That domain is already on your account. |
409 | { "error": "two active keys already — revoke one before minting another" } | The target website already has 2 active keys. |
429 | { "error": "too many requests" } | Rate limit exceeded — retry after the Retry-After header. |
Notes
- The
himg_live_website keys minted here are exactly what you configure in the LW Image WordPress plugin for each client site. - Account keys (
himg_acct_...) and website keys (himg_live_...) are not interchangeable — an account key never works as an image-API key, and a website key never authenticates against the Account API. - Ownership errors always come back as
404, whether the resource doesn't exist at all or just belongs to a different account.