Public API keys | IcloneU
Automations

Public API keys

The API Keys tab issues the keys your own code uses to reach your IcloneU account over HTTPS — contacts, conversations, tags, workflows, webhook subscriptions. This is what a key can reach, what the three access levels really gate, the expiry you set once at creation, and how to rotate one without breaking a live integration.

9 min read Intermediate Updated August 25, 2026

Open Automations in the left sidebar and pick the API Keys tab. The page states its own job in one line: "Public API keys for programmatic access to your account. Each key is shown in full only once at creation; revoke and re-create to rotate." A key here is a server-to-server credential: your backend sends it in an HTTP header and gets JSON back. It is not the key that powers your embedded web chat — that is a different tab, a different prefix and a different set of rules, and the first section below is the whole difference.

Included with every paid plan

Two kinds of key, and they are not interchangeable

IcloneU issues two credentials that both get called an API key. They live on different pages, protect different things, and each one is refused where the other belongs. Thirty seconds here saves an afternoon of 401s.

Web chat key (hk-)Public API key (ik-)
Where you create itConnections → API keysAutomations → API Keys
What it is forOne embeddable widget, answered by one CloneYour own code reading and writing your account's data
Who holds itThe visitor's browser — it is visible in your page sourceYour server, and nowhere else
What limits its reachWhich Clone answers, plus the Domains allowlistOne of three access levels, applied per endpoint
How it travelsInside the embed snippet's URLAn Authorization: Bearer ik-… header
How you rotate itDelete the key, create another, re-embedRevoke the key, create another, redeploy
Can it expire on its ownNoYes — you choose the term at creation
Sending the wrong one is a 401, not a warning

The public API checks the prefix before it does anything else. A request whose header does not begin with Bearer ik- is refused with a 401 and the code missing_api_key, even when the widget key it carries is perfectly valid. It does not work the other way round either — an ik- key does nothing for the chat widget. The widget key has its own walkthrough: Creating and managing API keys.

Creating a key

Three fields, one button, and one moment you cannot repeat.

  1. Open the tab

    Automations in the left sidebar, then the API Keys tab. If you do not see it, your team role does not include Automations, or your plan does not — the tab is part of every paid plan.

  2. Click Create Key

    The button sits at the top right of the page and opens the Create API Key dialog.

  3. Give it a Label

    Label is the name you will see in the grid, and the placeholder shows the idea: "e.g., Make.com Production". Name it after the system that will hold it, because that is the question you will be answering when you decide whether to revoke it. Generate Key stays disabled until the Label has something in it.

  4. Pick the Access Level

    Access Level offers Read Only, Standard and Full Access, and the dialog opens on Standard. The next section says exactly what each one buys.

    Heads up

    There is no edit dialog for a key. The level you pick here is the level it has forever — changing it means creating a second key and retiring the first.

  5. Pick the Expiration

    Expiration offers Never expires, 30 days, 90 days and 1 year, counted from the moment you generate the key. A fresh dialog opens on Never expires; if you have already created a key without leaving the page, the dialog keeps whatever you picked last time, so glance at it before you click.

    Heads up

    An expiry is a dead man's switch, not a reminder. Past the date the API answers 401 key_expired and the grid pill flips to Expired — with no warning beforehand and no way to extend.

  6. Click Generate Key and copy it

    The key appears once, in a dialog that says so plainly: "Copy this key now. You won't be able to see it again." Use Copy Key, paste it straight into your secret store, then click Done.

The key is stored as a fingerprint, not as text

IcloneU keeps a SHA-256 hash of the key plus its first eight characters — enough to recognise the key when it comes back and to show you a stub in the grid, and not enough to reconstruct it. Nobody can read it back to you: not the grid, not support, not a database query. If it is lost, the only route is revoke and create another.

What the three access levels actually gate

The level is checked per endpoint, not per resource, and the split is blunt on purpose: reads are open to every key, ordinary writes need Standard, and two areas need Full Access.

Access LevelWhat a key at this level can do
Read OnlyEvery read. List and open assistants, workflows, contacts, conversations and their messages, custom fields, connected platforms, tags, reviews and webhook subscriptions. It cannot change anything at all.
StandardEverything above, plus the ordinary writes: create and update a contact, add or remove a contact's tags, delete or erase a contact, create a tag, and post a message into a conversation.
Full AccessEverything above, plus the two privileged areas: changing a workflow's status, and every webhook-subscription write — create, update, delete, send test, rotate secret and redeliver.

A call that needs more than the key carries is refused with a 403 and the code insufficient_permissions, and the message names what was missing: "This API key does not have full access. Required: Full Access tier." Nothing partial happens first — the check runs before the request is read.

The three level names are in English everywhere

Read Only, Standard and Full Access are the names in the dialog, in the grid badge, in the API's own refusal message and in this guide. They are not translated: a Spanish-language session shows the same three English names. Read them as identifiers rather than as labels.

What a key reaches

Everything hangs off /api/public on your own IcloneU address, and every route is scoped to the account the key was created in — an id belonging to somebody else's account comes back as a 404, not as data.

  • Assistants (/assistants) — list your Clones, and read one.
  • Automations (/automations) — list your workflows, read one, and (Full Access) change a workflow's status.
  • Contacts (/contacts) — list, read, create, update, delete and erase a contact, and add or remove its tags.
  • Conversations (/conversations) — list, read one, read its messages, and post a message into it.
  • Custom fields (/custom-fields) — list the custom fields defined on your account.
  • Platforms (/platforms) — list the platform accounts you have connected.
  • Tags (/tags) — list and create.
  • Reviews (/reviews) — the summary, the list, and the schema behind them.
  • Webhooks (/webhooks) — the whole outbound-subscription surface, covered in Webhook subscriptions.

List endpoints take page and per_page. A page size above 100 is clamped to 100 rather than refused, and the response carries a meta block with page, per_page, total and total_pages so you can walk the whole set without guessing.

The endpoint reference lives at two URLs nothing in the product links to

Browse it at /api/public/docs — a full request-by-request reference with a Download openapi.json link — or fetch the machine-readable spec directly from /api/public/openapi.json and point your own client generator at it. Both are open without a key. Prepend your IcloneU address to either path.

Calls are rate-limited to 60 per minute per key, in a fixed one-minute window with no queue: request 61 is answered 429 immediately rather than held. The budget belongs to the key, so splitting a noisy job onto its own key stops it from starving the rest of your integration.

Reading the grid

Five columns — Label, Key, Access, Last Used and Created — and the status lives inside the first one.

  • Label carries a pill beside the name: Active, Expired once the expiration date has passed, or Revoked. The pill and the API agree — a key the grid calls Expired is a key the API is already refusing.
  • Key shows the first eight characters and an ellipsis. That is the ik- prefix plus five characters — enough to tell two keys apart in a config file, and not enough to be a credential.
  • Access is the level chosen at creation.
  • Last Used is stamped on every request the key gets through with, so it is the honest answer to the only question that matters before you revoke: is anything still calling with this? A key that has never been used reads Never — in English, in both interface languages.
  • Created is the date the key was generated. A revoked row is greyed out and stays in the list rather than disappearing.
The expiry date is not displayed anywhere — write it down

The Expiration you choose is stored and enforced, but no screen shows it back to you. It is not a column in the grid, it is not on the one-time key dialog, and there is no edit dialog to reopen. Unless you record it yourself when you create the key, the first sign that a 90-day key has aged out is a 401 key_expired in your own logs. Put the date next to the key in whatever holds your secrets.

Rotating, revoking, and the errors you will see

There is no regenerate button and no reveal. Rotation is revoke and create another — and because revoking takes effect on the very next request, the order you do it in decides whether anything goes down.

  1. Create the replacement first

    Same Access Level, a Label that says which generation it is. Deploy it to whatever holds your secrets and let the traffic move over.

  2. Confirm the old key has gone quiet

    Watch Last Used on the old row. While it is still moving, something is still calling with it — revoking now is an outage, not a rotation.

  3. Select the old key and click Revoke

    The confirmation is specific about the blast radius: "Are you sure you want to revoke the key "{0}"? Any integrations using this key will stop working immediately." Confirm and it is done — there is no undo and no recycle bin.

An expiring key has no extension

Nothing warns you before an expiration date, and nothing lets you push it out. The fix for an expiring key is the same as the fix for a leaked one: create the replacement, move the traffic, then revoke. If you cannot commit to that routine, choose Never expires and rotate on your own schedule instead.

What comes backWhat it means
401 missing_api_keyThe Authorization header is absent, or does not start with Bearer ik-. A web-chat hk- key lands here.
401 invalid_api_keyThe key is not a well-formed ik- key, or no key with that fingerprint exists in any account — including a key that was deleted and recreated elsewhere.
401 key_revokedThe key exists and was revoked.
401 key_expiredThe key is past the Expiration chosen when it was created.
403 insufficient_permissionsThe key is real but its Access Level is below what this endpoint needs.
404 not_foundNo such id in this account. Same answer whether the record never existed or belongs to somebody else.
429More than 60 requests from this key inside the same minute.
500 internal_errorThe call reached IcloneU and failed inside it. Safe to retry.

Frequently asked

No. A key has no edit dialog — the only row action is Revoke. Both choices are made once, at creation. Changing either one means creating a new key and retiring the old one.

No. A public API key is account-wide by design; the Clone binding belongs to the web-chat key model. What you can vary is the access level, so a read-only reporting job and a write-capable sync job should hold different keys.

The tab records one thing: Last Used, refreshed on every request the key gets through with. There is no per-key request log in the product, so treat Last Used as a liveness signal — useful for deciding whether a key is safe to revoke, not as an audit trail.

No. The row stays in the grid, greyed out, but the key itself is finished — every request with it answers 401 key_revoked. Create a replacement and deploy it.

No. /api/public/docs and /api/public/openapi.json are deliberately left open, so you can read the reference and generate a client before you ever create a key. Every actual data endpoint under /api/public needs one.

Was this guide helpful?
Thanks for the feedback!

Last updated August 25, 2026 · Automations

Reconnecting to the server… Reload
🗙
Connecting…
Connection lost
Reconnecting to the server…
We couldn't reconnect automatically.