# here.now agent mode

product: here.now
domain: here.now
base_url: https://here.now
alternate_base_url: https://api.here.now (same API through Cloudflare; use it when connections to here.now itself time out)
docs_url: https://here.now/docs
skill_url: https://here.now/skill.md
support_email: hello@here.now

## Summary
here.now lets agents publish static Sites to live URLs at {slug}.here.now or custom domains.

## Primary job
1. Publish Sites to live URLs at {slug}.here.now or custom domains.

## When to use
- Use here.now when a user asks an agent to publish, host, deploy, share, or put a file, folder, website, app, report, dashboard, visualization, or document online.
- Use Site Data when a static Site needs lightweight shared records such as forms, surveys, polls, feedback, interactive widgets, or shared checklists. Read the docs before generating the manifest.
- Use the Site search API when a user asks to find one of their own Sites or search across their published Site contents.
- Use the versions API when a user asks to see earlier versions of a Site, compare what changed, undo a publish, or roll back to how a Site looked before.
- Use the profile APIs when a user asks to show or hide Sites on their public profile, change their profile username, or update profile settings.
- When the user names a folder, project, or client for a Site ("publish this to my Reports folder", "file it under Acme"), pass folder on the publish or metadata call so their dashboard stays organized; use GET /api/v1/folders to see what exists. Do not invent folders or file Sites the user did not ask to file.
- Use here.now when a user needs a live URL quickly and does not want to create an account first.
- Use here.now when a user asks to host, deploy, or share a WebAssembly build: a game port, an emulator, a Godot or Unity web export, a Rust or Emscripten app, an in-browser tool or model demo. Publish the build output directory (the one containing index.html). If the build uses threads (Emscripten -pthread, Godot with Thread Support on, Unity multithreading, wllama, WebContainers), pass crossOriginIsolation: true; if the finalize response's warnings mention WebAssembly and the app shows a blank canvas or 'SharedArrayBuffer is not defined', that setting is the fix. Threaded builds do not run inside iframes on non-isolated pages (X posts, third-party sites); single-threaded builds embed fine.
- Use here.now when a user wants a widget or embeddable component for an existing website: publish it as a public Site and give them an iframe tag pointing at its URL.
- Use a here.now workspace when the user wants a Site owned by their team rather than their personal account — publishing into it just means adding the X-HereNow-Account selector.
- Use vanity URLs (PUT /api/v1/vanity-urls/subdomain) when the user wants every Site under their own name, like a readable {site-name}.{name}.here.now address; use a custom domain when they want one Site at one hostname they choose; use a workspace when the Sites should be owned by a team.
- Use the /api/v1/registrar endpoints when a user asks to buy, register, or get a domain for a Site ("get me a .com for this"): search, quote, confirm the price and renewal with the user, then purchase. Use POST /api/v1/domains instead when the user already owns the domain elsewhere.
- Use here.now Drive when a user asks an agent to save private files, store context for later, share a folder with another agent, or keep durable cloud state outside the local workspace.
- Do not use here.now for server-side compute, long-running processes, general-purpose databases, or backend code execution. Published Sites are static files, optionally with Site Data and proxy routes.

## Authentication
- Identify your agent on every request: send X-HereNow-Client: <harness>/<detail> (e.g. instinct/agent, cursor/direct-api, claude-code/publish-sh), with or without Authorization. Use the platform's name, not a bot or persona name. This is how your platform is recognized; attribution and any platform-specific addressing depend on it.
- Anonymous publishing: omit Authorization. Sites expire after 24 hours and have lower limits.
- Authenticated API: send Authorization: Bearer <API_KEY>.
- Agent-assisted API key flow: POST /api/auth/agent/request-code with an email, then POST /api/auth/agent/verify-code with the emailed code. Send X-HereNow-Client on both calls (or the same value as "client" in the JSON body): the new account is attributed to your platform and the code email names it.
- Recommended agent storage: write the returned API key to ~/.herenow/credentials with 0600 permissions.
- Accounts support up to 50 named API keys (hnk_ prefix), each individually revocable. Manage them via GET/POST /api/v1/me/keys and DELETE /api/v1/me/keys/:id. Use one key per agent or tool. See /docs#api-keys.
- Workspace targeting: API keys are personal; add X-HereNow-Account: <workspace-subdomain-or-uuid> (or the account body field on publish create) to act inside a workspace. No selector always means the personal account. List valid selectors with GET /api/v1/accounts. See /docs#workspaces.
- Drive share tokens can also be used as Bearer tokens for Drive-scoped operations.
- Stripe Projects: `stripe projects add herenow/hosting` provisions a here.now account and syncs an API key to the project environment as HERENOW_API_KEY. See /docs#stripe-projects.
- The email address is the account: requesting a sign-in code for a new address creates a separate empty account, it does not attach to an existing one. When a user has a new email, move the account instead: POST /api/v1/me/email-change {newEmail} (API key), the user reads the 6-digit code from the new mailbox and gives it to you, then POST /api/v1/me/email-change/confirm {code}. Sites, API keys, and sign-ins carry over. On accounts with billing or a workspace-admin role, API-key requests wait 24 hours (holdUntil) before they can be confirmed. The dashboard has the same control under Settings -> General. See /docs#auth-email-change.

## Publish in three calls
Copy these as written; keep the X-HereNow-Client header on every call (set <harness>/<detail> to your platform, e.g. instinct/agent). Add -H "Authorization: Bearer <API_KEY>" for a permanent Site.

    curl -sS https://here.now/api/v1/publish \
      -H "X-HereNow-Client: <harness>/<detail>" \
      -H "content-type: application/json" \
      -d '{"files":[{"path":"index.html","size":1234,"contentType":"text/html; charset=utf-8"}]}'
    # PUT each file's bytes to upload.uploads[].url (Content-Type as listed), then:
    curl -sS -X POST https://here.now/api/v1/publish/<slug>/finalize \
      -H "X-HereNow-Client: <harness>/<detail>" \
      -H "content-type: application/json" \
      -d '{"versionId":"<upload.versionId>"}'

Share siteUrl from the finalize response exactly as returned (it is the Site's address; do not construct a URL from the slug). For an anonymous Site also share claimUrl, copied byte-for-byte.

## Key endpoints
One line per operation. Full request/response schemas, parameters, and error codes: [openapi.json](https://here.now/openapi.json). The HTML docs at https://here.now/docs carry worked examples and section anchors (e.g. /docs#mounts); this text version is a summary and does not include those anchors.

- POST /api/v1/publish - create a new Site and receive presigned upload URLs. Optional folder (a dashboard folder name, created if missing, or id) files the Site on creation (authenticated only).
- PUT /api/v1/publish/:slug - update an existing Site. Optional folder moves it into a dashboard folder (name or id) or, with null, back to the root; omitted leaves it.
- POST /api/v1/publish/:slug/finalize - make an uploaded version live.
- POST /api/v1/publish/:slug/uploads/refresh - refresh expired presigned upload URLs so an interrupted upload can resume (API keys and anonymous claim tokens both work).
- PATCH /api/v1/publish/:slug/metadata - patch Site displayName/displayDescription, TTL, viewer metadata, password, SPA mode, and folder (the Site's dashboard folder: a name, created if missing, or id; null unfiles) without publishing a new version.
- GET /api/v1/publish/:slug - get Site details, including the live version's manifest, its attribution (currentVersionSource, currentVersionCreatedAt: what made it live and when), and the Site's dashboard folder.
- GET /api/v1/publish/:slug/files - list the live version's files with a ready-to-GET url per file (owner API key; workspace Sites via X-HereNow-Account).
- GET /api/v1/publish/:slug/files/:path - read one file's bytes from the live version (owner API key). Works for password-protected and restricted Sites without the visitor password; use it to inspect before editing, to reconcile after a version_conflict, or to export a Site. HEAD returns the headers (ETag = sha256, Content-Length) without the body.
- DELETE /api/v1/publish/:slug - delete a Site.
- POST /api/v1/publish/:slug/claim - claim an anonymous Site into the authenticated account using its claim token.
- POST /api/v1/publish/:slug/duplicate - duplicate an owned Site to a new slug (does not copy passwords, restricted allowlists, domain mounts, or TTL).
- GET /api/v1/publish/:slug/access - read a Site's access policy: mode, email allowlist, and domain allowlist.
- PATCH /api/v1/publish/:slug/access - set anyone_with_link or restricted access. Replaces the full allowlists; read, merge, then write to add one entry.
- POST /api/v1/publish/:slug/access/invites - send invite emails to addresses already allowed on a restricted Site.
- GET /api/v1/publishes - list the selected account's Sites, each with its dashboard folder ({id, name} or null). Add folder=<id|name> to list one folder or folder=none for the unfiled root. Add scope=all to list everything the caller can see (personal + shared + joined workspaces, cursor-paginated with ownership/workspace annotations); scope=all cannot combine with X-HereNow-Account or folder.
- GET /api/v1/publishes/search - search the authenticated user's active Sites by metadata, path, and indexed content with ?q=<query>; results carry the Site's folder. Add includeShared=1 to include accepted/opened Sites shared with the authenticated account.
- GET /api/v1/folders - list the selected account's dashboard folders (alphabetical, with live Site counts). Workspace folders via X-HereNow-Account.
- POST /api/v1/folders - create an empty folder: {name} (1 to 60 characters, unique in the account case-insensitively). 409 folder_exists carries details.folderId; 409 folder_limit at 50. Usually unnecessary: folder on publish/metadata creates a named folder when missing.
- PATCH /api/v1/folders/:id - rename a folder: {name}. Admins (the owner, on a personal account) or the folder's creator; the Sites in it are unaffected.
- DELETE /api/v1/folders/:id - delete a folder; its Sites move back to the root, nothing else changes. Returns {removed, unfiled}. Admin or creator.
- GET /api/v1/publishes/:slug/data/:collection - list owner-visible Site Data records for one owned Site collection (collections are declared in the Site's published .herenow/data.json manifest; see /docs#sitedata).
- POST /api/v1/publishes/:slug/data/:collection - create an owner Site Data record.
- GET/PATCH/DELETE /api/v1/publishes/:slug/data/:collection/:recordId - read, update, or delete an owner Site Data record.
- GET /api/v1/publishes/:slug/analytics - get analytics for one owned Site with ?range=24h|7d|30d|90d|all.
- GET /api/v1/analytics - get analytics rollups across all owned Sites with ?range=24h|7d|30d|90d|all (workspace rollups: admins only).
- GET /api/v1/publish/:slug/versions - list a Site's recorded version history, including owner-only previewUrl hosts.
- POST /api/v1/publish/:slug/versions/:versionId/restore - instantly restore a past version as the live Site (pointer flip, no re-upload).
- DELETE /api/v1/publish/:slug/versions/:versionId - permanently delete one historical version (the live version cannot be deleted).
- POST /api/v1/publish/from-drive - publish a Drive version as a Site (optional folder files it in a dashboard folder).
- GET /api/v1/domains - list the selected account's custom domains, including each domain's mounts.
- POST /api/v1/domains - connect a custom domain to the selected account (returns DNS instructions and verification status). For a domain bought through here.now, or a subdomain of one, the records are written for you and the response says dns: "managed". If the domain currently serves a site at Webflow, Shopify, or another Cloudflare-backed host, have the user remove it there first: Cloudflare will not route a hostname to a second provider while the first holds it, so the domain stays pending with correct DNS until the release is picked up, which can take many hours. 422 domain_not_registered when nobody has registered the name (its records could never resolve): nothing is added; buy it with the registrar endpoints when details.purchasable_here is true (the purchase connects it), or have the user register it first.
- GET /api/v1/domains/:domain - check one custom domain's verification and serving status. Pending domains normally verify within ~20 minutes of DNS records being added, but can take a few hours when records or nameservers changed afterwards; the response's verification.state is "verifying" (no action needed if the records match dns_instructions, keep polling) or "action_required" (after 24 hours or a terminal state: fix DNS to match dns_instructions). verification.reason "not_registered" means nobody has registered the name, so no DNS fix helps: buy it or have the user register it; the pending entry is picked up when it is. Never delete and re-add a pending domain: that restarts verification and disconnects mounted Sites.
- DELETE /api/v1/domains/:domain - disconnect a custom domain.
- GET /api/v1/publish/:slug/primary-domain - read the Site's primary-domain state and the eligible domain mounts.
- PUT /api/v1/publish/:slug/primary-domain - make a connected domain mount the Site's primary domain - its here.now addresses then 308-redirect ({"domain": "example.com"}; {"domain": null} turns it off).
- GET /api/v1/mounts - list mounts on the personal vanity subdomain, or on a custom domain with ?domain=<hostname>.
- POST /api/v1/mounts - mount a Site at a path on the vanity subdomain or a custom domain: {mount_path, slug, domain?}; empty mount_path targets the root (on the vanity subdomain, that is what {name}.here.now shows). (The older /api/v1/links endpoints are a deprecated alias.)
- GET/PATCH/DELETE /api/v1/mounts/:mount_path - read, re-point ({slug}), or remove one mount. Use __root__ for the root mount and ?domain= (or body domain on PATCH) for a custom domain.
- GET /api/v1/vanity-urls - both vanity roots at a glance: subdomain and domain (state, hostname, urlShape, sites named/pending), each null when off.
- PUT /api/v1/vanity-urls/subdomain - turn on the user's vanity subdomain: {subdomain: "adam"} (omit when their username is already a chosen name). Claims the name (it becomes the username too) and provisions the wildcard certificate; state is provisioning for about a minute, then active. Paid plans, personal accounts. 409 subdomain_unavailable / username_locked_by_vanity_subdomain, 402 vanity_urls_plan_required.
- GET /api/v1/vanity-urls/subdomain - the vanity subdomain's state (provisioning, active, degraded, suspended), hostname, urlShape, root (what {name}.here.now shows), and sites {named, unnamed, pendingConsent}; null with an offer block when it is off.
- DELETE /api/v1/vanity-urls/subdomain - release the vanity subdomain: its addresses stop serving, Sites keep their {slug}.here.now addresses, the name stays reserved by the username.
- GET /api/v1/vanity-urls/subdomain/availability - ?name= is this name available for the caller (advisory; the PUT is the authority).
- POST /api/v1/vanity-urls/subdomain/provisioning - retry provisioning when the state is degraded.
- GET /api/v1/vanity-urls/domain - the vanity domain's state; null with an offer (the account's purchased apex domains) when off.
- PUT /api/v1/vanity-urls/domain - turn on the vanity domain on a domain bought through here.now: {registrationId} (from GET /api/v1/registrar/domains) or {domain}. Every Site then also serves at {site-name}.{domain}; provisioning takes a few minutes (poll GET). One per account; paid plans; personal accounts. 404 registration_not_found for a domain not bought here, 409 vanity_domain_limit.
- DELETE /api/v1/vanity-urls/domain - turn the vanity domain off; the domain and its custom-domain setup stay.
- POST /api/v1/vanity-urls/domain/provisioning - retry vanity domain provisioning when the state is degraded.
- POST /api/v1/vanity-urls/name-existing-sites - name the Sites that existed before the vanity subdomain was turned on (they stay unnamed until asked): {slugs?: [...]}, defaults to every pending one. 202 {job: {id, total}}; poll GET /vanity-urls/subdomain sites.pendingConsent.
- GET /api/v1/handle - get the personal vanity subdomain (formerly "handle") and its mounts.
- POST /api/v1/handle - alias of PUT /api/v1/vanity-urls/subdomain (body {username}).
- DELETE /api/v1/handle - alias of DELETE /api/v1/vanity-urls/subdomain.
- GET /api/v1/registrar/search - search domains to buy: ?q=<keyword or domain>&tlds=com,io (optional). Ranked results (match: exact, name, variant) with estimated first-year and renewal prices; show the user both. Names another here.now account routes come back purchasable:false.
- GET /api/v1/registrar/check/:domain - authoritative availability and price for one apex domain (?years= optional; omit for the TLD minimum). price.totalCents is what purchase charges; premium names return acknowledgedPriceCentsRequired.
- POST /api/v1/registrar/purchase - buy a domain and connect it: {domain, years?, connectSlug?, acknowledgedPriceCents? (required for premium), payment?: {shared_payment_token} | {saved_payment_method}}. Charges the saved card, or 402 payment_method_required with details.accepts (a hosted card page for the user, or a shared-payment-token recipe for the agent). 201 returns registration, quote, charged, dns: "managed"; the domain activates within minutes (poll GET /api/v1/domains/:domain). Confirm domain, price, and renewal with the user first: purchases are final.
- GET /api/v1/registrar/domains - list domains bought through here.now (status, expiry, auto-renew, what they are connected to).
- GET /api/v1/registrar/:domain - one purchased domain: status, expiresAt, renewalPriceCents, autoRenew, transferLockExpiresAt, connected.
- PATCH /api/v1/registrar/:domain - turn auto-renew on or off: {autoRenew: boolean}. Renewals charge the saved card about 30 days before expiry.
- GET /api/v1/registrar/:domain/records - DNS records at the registrar for a purchased domain; managed:true marks the serving records here.now controls.
- PUT /api/v1/registrar/:domain/records - replace the editable records of a purchased domain ({records: [{type: A|AAAA|CNAME|MX|TXT|SRV, host?, value, ttl?, priority?}]}; MX needs priority): email setup, DKIM CNAMEs, verification records, a subdomain pointed at another service. Replace-all: GET first and include the records to keep. Serving records (apex A/AAAA, www, here.now subdomains) are kept and 409 if a record would touch them. Subdomains served by here.now are added with POST /api/v1/domains, not here.
- GET /api/v1/registrar/:domain/transfer - unlock a purchased domain and return its transfer-out authorization code (free; after ICANN's 60-day hold). Emails the account owner every time. Only when the user asked to move the domain.
- GET /api/v1/registrar/payment-method - the domains view of /api/v1/me/payment-methods (alias): paymentMethod (the saved method domain purchases and renewals charge: the account default unless it is flagged), saved (every method on the account, with ids), and accepts: how to pay (the hosted card page; and, when accepted, the shared-payment-token network_id, with a Stripe Link CLI line as one way to obtain a token).
- POST /api/v1/registrar/payment-method - alias of POST /api/v1/me/payment-methods that returns the user to the Domains tab: a hosted page where the user saves a card (no body). The first card saved becomes the account default, which domain purchases and renewals charge.
- PUT /api/v1/registrar/payment-method - make a saved method the account default: {paymentMethodId} from GET's saved list is what domain purchases and renewals charge (same as PUT /api/v1/me/payment-methods/default). For one purchase only, send body.payment.saved_payment_method on POST /purchase instead.
- DELETE /api/v1/registrar/payment-method/:id - alias of DELETE /api/v1/me/payment-methods/:id: remove a saved payment method (a dead card, a one-time virtual card saved by mistake); the plan's card is refused (409), change it in the billing portal.
- GET /api/v1/me/payment-methods - every saved payment method on the account with roles (default, plan) and flagged (declined; skipped until chosen again), default (the account default), charges (what an automatic charge uses right now: the default unless it is flagged), plan (the active subscription), and accepts (the hosted card page; and, when accepted, the shared-payment-token network_id).
- POST /api/v1/me/payment-methods - get a hosted page where the user saves a card (no body). The first card saved by any product becomes the account default; a later card does not change it.
- PUT /api/v1/me/payment-methods/default - make a saved method the account default ({paymentMethodId}), which every automatic charge uses. Choosing a method clears its flag. Plan billing keeps the card on the subscription (change it in the billing portal). To charge a different saved card once, name it on that request instead.
- DELETE /api/v1/me/payment-methods/:id - remove a saved payment method; the card an active subscription bills is refused (409). Removing the default makes another saved method the default.
- GET /api/v1/me/variables - list account variables for proxy routes (names and upstream pinning only; values are never returned).
- PUT /api/v1/me/variables/:name - create or update an account variable ({value, allowedUpstreams?}) injected server-side into proxy-route calls declared in a Site's .herenow/proxy.json manifest (see /docs#proxy-routes). allowedUpstreams entries are hostnames ("xyz.supabase.co", not URLs; a URL is reduced to its host) matched against the route's upstream host and its subdomains. The name HERENOW_VISITOR_EMAIL is built in (the signed-in visitor's verified email on a restricted Site, /docs#proxy-visitor-identity) and cannot be stored: 400.
- DELETE /api/v1/me/variables/:name - delete an account variable.
- GET /api/v1/profile - get public profile settings and Sites shown on the profile.
- PATCH /api/v1/profile - update profile visibility, automatic profile listing, and the bio (one line, <=160 chars) and link (one http(s) URL) shown under the username.
- PATCH /api/v1/profile/username - change the profile username.
- GET /api/v1/profile/sites - list Sites shown on the profile.
- POST /api/v1/profile/sites - add an owned ungated Site to the profile.
- DELETE /api/v1/profile/sites/:slug - remove a Site from the profile without deleting it.
- POST /api/v1/drives - create a Drive.
- GET /api/v1/drives - list Drives.
- GET /api/v1/drives/default - get or create the default Drive.
- GET /api/v1/drives/:driveId - get Drive details.
- PATCH /api/v1/drives/:driveId - patch Drive metadata (name, description, isDefault).
- DELETE /api/v1/drives/:driveId - delete a Drive.
- GET /api/v1/drives/:driveId/files - list Drive files.
- GET /api/v1/drives/:driveId/files/:path - read a Drive file (HEAD for its headers only).
- POST /api/v1/drives/:driveId/files/uploads - stage a Drive file write.
- POST /api/v1/drives/:driveId/files/finalize - finalize a staged Drive upload.
- DELETE /api/v1/drives/:driveId/files/:path - delete a Drive file or prefix.
- POST /api/v1/drives/:driveId/files/move - move or rename a Drive file.
- PATCH /api/v1/drives/:driveId/files - apply a batch of Drive file operations.
- GET /api/v1/drives/:driveId/tokens - list a Drive's share tokens.
- POST /api/v1/drives/:driveId/tokens - create scoped Drive share tokens.
- DELETE /api/v1/drives/:driveId/tokens/:tokenId - revoke a Drive share token.
- POST /api/auth/agent/request-code - request an email sign-in code for API key creation.
- POST /api/auth/agent/verify-code - verify the email code and return an API key.
- GET /api/v1/me/keys - list API keys, including full key values.
- POST /api/v1/me/keys - create a named API key (name it after the agent or tool, e.g. claude, cursor).
- DELETE /api/v1/me/keys/:id - revoke one API key without affecting others.
- GET /api/v1/me/email-change - the account's current email and its pending email-change request, if any (holdUntil when it cannot be confirmed yet).
- POST /api/v1/me/email-change - start moving the account to a new email: a confirmation code goes to the new address only; the user gives it to you. 24-hour hold on accounts with billing or workspace-admin access.
- DELETE /api/v1/me/email-change - cancel the pending email change.
- POST /api/v1/me/email-change/confirm - confirm the email change with the 6-digit code from the new mailbox; five wrong codes cancel the request.
- GET /api/v1/accounts - list the caller's personal account and joined workspaces (the valid X-HereNow-Account selectors). Add includeJoinable=1 to also list workspaces the caller could join via email-domain auto-join.
- POST /api/v1/accounts - create a workspace in one call (account, subdomain claim, and serving provisioning).
- GET /api/v1/accounts/subdomain-availability - check whether a workspace subdomain is available with ?subdomain=<name>.
- POST /api/v1/accounts/:accountId/provisioning - retry workspace serving provisioning after a workspace_not_ready error.
- GET/POST /api/v1/accounts/:accountId/invites - list or send workspace email invites.
- DELETE /api/v1/accounts/:accountId/invites/:inviteId - revoke a pending workspace invite.
- GET /api/v1/me/invites - list the caller's own pending workspace invites (each carries its accept/decline endpoints).
- POST /api/v1/accounts/:accountId/invites/:inviteId/accept - accept a workspace invite.
- POST /api/v1/accounts/:accountId/invites/:inviteId/decline - decline a workspace invite.
- GET /api/v1/accounts/:accountId/members - list workspace members (admin-only).
- POST /api/v1/accounts/:accountId/members - add an existing here.now user to the workspace by email without an invite (admin-only; prefer invites for people who may not have an account).
- PATCH/DELETE /api/v1/accounts/:accountId/members/:userId - change a member's role, remove a member, or leave.
- GET/POST /api/v1/accounts/:accountId/domain-rules - list or create email-domain auto-join rules for a workspace.
- DELETE /api/v1/accounts/:accountId/domain-rules/:ruleId - disable an auto-join domain rule.
- POST /api/v1/accounts/:accountId/domain-rules/apply - join a workspace when an active rule matches the caller's email domain.
- GET /api/v1/accounts/:accountId/site-labels - list the account's Site names (workspace labels, or a personal account's names on its vanity URL; workspace admin-only).
- POST /api/v1/accounts/:accountId/site-labels - name a Site: {slug, label}. On a workspace it serves at {label}.{workspace}.here.now (admin-only); on a personal account with a vanity subdomain (accountId = the user id) at {label}.{name}.here.now. Names cannot look like a generated slug (word-word-xxxx).
- PATCH /api/v1/accounts/:accountId/site-labels/:label - rename a Site's name (the old name 307-redirects; body redirect:false removes the old aliases instead).
- DELETE /api/v1/accounts/:accountId/site-labels/:label - remove a Site's name and its redirects; the Site keeps its canonical {slug}.here.now URL.
- PATCH /api/v1/accounts/:accountId - rename a workspace display name (admin-only).
- DELETE /api/v1/accounts/:accountId - permanently delete a workspace (admin-only).
- POST /api/v1/support - send an authenticated support request to the here.now team ({subject, message}).

## Install
- npx skills add heredotnow/skill --skill here-now -g
- curl -fsSL https://here.now/install.sh | bash
- hermes skills install well-known:https://here.now/.well-known/skills/here.now
- stripe projects add herenow/hosting

## Reference
- [Docs](https://here.now/docs) - canonical product documentation and API reference.
- [OpenAPI](https://here.now/openapi.json) - OpenAPI 3.1 specification for the stable public API.
- [Pricing](https://here.now/pricing.md) - machine-readable pricing tiers and plan limits.
- [Hosted skill](https://here.now/skill.md) - hosted here.now skill for agents.
- [Skill version](https://here.now/api/skill/version) - current skill/install metadata.
- [Hermes well-known skills](https://here.now/.well-known/skills/index.json) - Hermes well-known skill index.
- [Public skill repo](https://github.com/heredotnow/skill) - public GitHub skill and plugin repository.
- [Public repo AGENTS.md](https://github.com/heredotnow/skill/blob/main/AGENTS.md) - coding-agent instructions for the public skill repo.
- [llms.txt](https://here.now/llms.txt) - concise agent context.
- [llms-full.txt](https://here.now/llms-full.txt) - expanded agent context.
- [docs llms.txt](https://here.now/docs/llms.txt) - docs-scoped agent context.
- [API llms.txt](https://here.now/api/llms.txt) - API-scoped agent context.
- [index.md](https://here.now/index.md) - markdown homepage fallback.
- [docs.md](https://here.now/docs.md) - markdown docs fallback (the agent knowledge pack; /docs serves the same to CLI/markdown requests).
- [agent mode](https://here.now/?mode=agent) - structured agent homepage view.
- [agent.json](https://here.now/.well-known/agent.json) - agent discovery manifest.
- [agent.json alias](https://here.now/agent.json) - root alias for agent discovery.
- [well-known agent alias](https://here.now/.well-known/agent) - extensionless well-known alias for agent discovery.
- [agent-card.json](https://here.now/.well-known/agent-card.json) - agent card describing here.now capabilities.
- [ai-plugin.json](https://here.now/.well-known/ai-plugin.json) - OpenAI-style plugin manifest pointing to OpenAPI.
- [API catalog](https://here.now/.well-known/api-catalog) - RFC 9727 API catalog/linkset.
- [schema map](https://here.now/schema-map.xml) - schema map advertised from robots.txt.
- [agent resources schema feed](https://here.now/schema-feeds/agent-resources.jsonl) - JSONL structured-data feed for agent resources.
