Muse (Meta) — no install. Tell Muse "Set up HiRey as a Custom Connector for me". It gets one anonymous key with a single call (POST https://hi.hirey.ai/v1/agents/api-keys), searches people over HTTPS, then asks you to sign in. Full steps for agents: https://hirey.ai/llms.txt (section "Muse (Meta)").
FOR YOU
Say this to Muse:
Set up HiRey as a Custom Connector for me: https://hirey.ai/install/muse
Muse connects, asks you to sign in, then offers to introduce you on HiRey. Nothing is published until you say yes.
Using Instinct? Say this:
Connect HiRey for me: https://hirey.ai/install/muse
FOR MUSE — or Instinct, or any agent that works over HTTPS without an installer
HiRey is not in Muse's Connectors directory yet, so add it as a Custom Connector. There is nothing to install and no script to run: HiRey is a plain HTTPS API. When the user says "Set up HiRey as a Custom Connector", "Connect HiRey" or "install HiRey" (or 装 HiRey / 安装 HiRey), that is the go-ahead for the steps below. HiRey is connected when one search returns people; setup is finished when the user has signed in (step 4). Then offer step 5, and use step 6 when the user sends a photo taken with someone.
1.
Get the connector key (one call)
POST https://hi.hirey.ai/v1/agents/api-keys
{"display_name":"Muse","agent_type":"muse","device_name":"Muse"}
Use your own name if you are not Muse, e.g. {"display_name":"Instinct","agent_type":"instinct","device_name":"Instinct"}. device_name is the name the user sees for this connection on hirey.ai/me. This creates no user account (only an anonymous connection record), sends no personal data and costs nothing. The key can only search until the user signs in (step 4).
Store the returned api_key as the connector's credential: in your secure credential store if you can write to it, otherwise in a private file on your own computer that only you can read (mode 600). Don't paste it into chat or logs.
Create it once. If a HiRey key is already saved, reuse it. If a saved key stops working, tell the user instead of creating another one. An HTML 503 from this call means you were rate-limited and nothing was created: wait 60 seconds and retry once. On any other failure, don't retry; tell the user. The 201 response may also carry fields and text meant for Codex or MCP clients: setup (including codex_config_toml and "relaunch Codex"), mcp_url, and MCP tool names such as google_link in login. Ignore them; over HTTPS you sign in with the calls in step 4.
2.
Connector settings
Name: HiRey
Base URL: https://hi.hirey.ai
Header: Authorization: Bearer <api_key>
Operation: POST /v1/capabilities/hi.workspace-workflows/call
Body: {"action":"people.find","payload":{"query":"seed-stage fintech founder in SF"}}
OpenAPI: https://hirey.ai/openapi.json
{"action":"catalog"} lists every operation. {"action":"describe","payload":{"operation":"<name>"}} shows one operation's fields. An operation that needs the user's yes also takes "confirmation":{"approved":true,"operation":"<name>"} next to payload; send it only after the user has said yes to that exact action. A 503 on a call is a temporary outage, not a bad key: wait 60 seconds and retry once.
3.
Test, then tell the user
Run catalog, then one people.find. When it returns people, tell the user HiRey is connected, then go straight to step 4.
4.
Sign in (right after the first search)
Searching works without sign-in. Introducing the user and publishing their Page (step 5), photos (step 6), posting, contacting, messaging and scheduling return verified_login_required until the user signs in, so ask now. Ask which sign-in they already use with HiRey (phone, email or Google), so they don't end up with a second account.
POST https://hi.hirey.ai/v1/capabilities/hi.phone-binding/call with {"action":"bind","phone":"+14155550123"}, then {"action":"verify","code":"<code from the SMS>","display_name":"<their full name>"} (display_name is the name people see when the user connects with them. Use the full name the user gave you; if you don't know it, ask. Never guess it, for example from an email address.)hi.email-binding and "email".hi.google-link with {"action":"start"}. The user opens verification_url on their own device, then you call {"action":"poll"} until status is verified.Authorization: Bearer <api_key> header on all sign-in calls (phone, email and Google); the key tells HiRey which connection to sign in.The same key keeps working afterwards; there is no reinstall.
5.
Introduce your owner
Right after sign-in, check whether the user already has a Page; if so, share its address when it is live (otherwise send them to hirey.ai/me). If not, offer once to introduce them on HiRey so people can find them. Write only from what they told you, show them the exact text and address, and publish only after they say yes.
Every call is POST https://hi.hirey.ai/v1/capabilities/hi.workspace-workflows/call with the same Bearer key and {"action":"<operation>","payload":{...}}. Give each write its own idempotency_key. This step only creates a first Page and never republishes an existing one: publishing replaces the whole Page, photo included, so changes go through hirey.ai/me.
identity.me returns the user's person_id, slug and visibility_status. If slug is set, they already have a Page: share https://hirey.ai/p/<slug> only when visibility_status is public or unlisted; otherwise it was taken down, so send them to hirey.ai/me. Then stop.people.find {"query":"<their full name>"}. A result with their own person_id is already theirs: share it and stop. If a result with another person_id is clearly them, don't create another Page. Tell them to ask the Connector shown on that Page for a claim link, and stop.page.mine: a row whose subject_person_id is their person_id is their private draft. Start from its text and save it with page.draft in 5.slug, display_name, a one-line headline, bio_markdown, and if given location_text and website_url (only a full https:// address). No private phone, email or address, nothing guessed. The slug is lowercase letters, digits and hyphens, at least four characters. Show the exact text and https://hirey.ai/p/<slug> and ask once.page.create {"idempotency_key":"...","content":{"slug":"...","display_name":"...","headline":"...","bio_markdown":"..."}} returns page_draft_id and revision; for their private draft, page.draft {"idempotency_key":"...","page_draft_id":"...","if_revision":<current_revision>,"content":{...}} instead, with its content_json, only the shown fields replaced and every other key kept; page.authorize {"idempotency_key":"...","page_draft_id":"...","draft_revision":<revision>} with "confirmation":{"approved":true,"operation":"page.authorize"} returns authorization_id; page.publish {"idempotency_key":"...","page_draft_id":"...","draft_revision":<revision>,"authorization_id":"...","visibility_status":"public","public_fields":["slug","display_name","headline","bio_markdown"]} with "confirmation":{"approved":true,"operation":"page.publish"}. public_fields lists exactly the fields you showed.https://hirey.ai/p/<slug> only after page.publish returns. "Already in use" may mean they already have a Page: check it instead of adding a suffix.Agents find the Page at once with people.find by full name; the hirey.ai/people search shows it within about a minute. Full recipe: /llms.txt, "5. Introduce your owner".
6.
You took a photo with someone on HiRey
When the user sends a photo with someone and names them, connect the two. The person is known only because the user names them, never by face recognition. One named person per photo; ask once, and publish only after the user says yes. When HiRey can, that person also gets a private card to confirm: HiRey lets them know, or the user texts them the link. When they tap Connect, the line turns solid.
people.find {"query":"<the name>"} and take the match: its person_id and slug.https://hirey.ai/p/<slug>: "Publish this photo with <name> on HiRey? When HiRey can, <name> will also get a private card of it so they can confirm." If it is the wrong person, stop. Only after the user's yes, which covers every call below, the card included:PUT /v1/media-assets does not take an API key): media.upload.prepare {"idempotency_key":"...","intent":"evidence","original_filename":"photo.jpg","mime_type":"image/jpeg","size_bytes":<bytes>,"content_sha256":"<hex SHA-256>","title":"..."} returns media_work_id; agentic_media.upload.describe {"media_work_id":"..."} returns missing_parts; PUT each part's bytes (offset_bytes, length_bytes) to its url with its required_headers (x-hi-upload-capability) and no Authorization; agentic_media.upload.complete {"media_work_id":"...","idempotency_key":"..."} returns source_asset_id.capture.record {"idempotency_key":"...","source_kind":"upload","beneficiary_kind":"connector_person","subject_person_id":"<person_id>","subject_resolution":"public","media_asset_id":"<source_asset_id>","occurred_at":"<ISO 8601 with timezone>"} returns moment_id. If it refuses that person, stop and tell the user; never retry by creating a new Person.media.create {"idempotency_key":"...","media_kind":"image","media_asset_id":"<source_asset_id>"} returns media_id and revision; media.request_review {"idempotency_key":"...","media_id":"...","revision":<revision>}; media.review_decide {"idempotency_key":"...","media_id":"...","revision":<revision>,"verdict":"approved"} returns result_revision; media.authorize {"idempotency_key":"...","media_id":"...","revision":<result_revision>} returns authorization_id; capture.publish_photo_moment {"idempotency_key":"...","moment_id":"...","media_id":"...","authorization_id":"...","expected_media_asset_id":"<source_asset_id>","public_contexts":[]}. The last three each take "confirmation":{"approved":true,"operation":"<that operation>"}. If any call refuses, tell the user the photo was not published and stop; don't make the card.meeting_share.invite {"idempotency_key":"...","moment_id":"...","media_asset_id":"<source_asset_id>","subject_person_id":"<person_id>"} with "confirmation":{"approved":true,"operation":"meeting_share.invite"} returns share_id, recipient_url, target_notified and not_notified_reason.target_notified is true, HiRey is letting that person know itself with fixed text and a link to the card (it may wait until morning): tell the user so, and give them recipient_url only if they ask. If it is false, HiRey sent nothing (not_notified_reason says why): give the user recipient_url to text that person from their own phone. You never post or send the link yourself. The person opens it, signs in and taps Connect, and the line turns solid. The link can connect for 30 days.moment_id, source_asset_id and share_id. To make a new card later, when the user asks, call only meeting_share.invite with the same moment_id and media_asset_id and a new idempotency_key; never upload the same photo again.meeting_share.invite refuses, the photo stays published: subject_not_originated_here means that person hasn't joined and someone else added them; the photo stays published with a dashed line and nothing more is needed now (make the card after they join, if asked). sender_display_name_required: the user has no name others see yet; if they told you their own name, save it with identity.update_display_name {"idempotency_key":"...","display_name":"..."} and tell them in a few words that others will see it, otherwise ask what name to show (or they add it at https://hirey.ai/me); never replace a name they already have unless they ask. recipient_display_name_required: save the name the user gave with person.display_name.set {"idempotency_key":"...","subject_person_id":"...","display_name":"..."}. After either, call meeting_share.invite again with a new idempotency_key. Anything else: tell the user the card couldn't be made.meeting_share.revoke {"idempotency_key":"...","share_id":"..."} with "confirmation":{"approved":true,"operation":"meeting_share.revoke"}. The link stops working at once; the published photo stays.Full recipe: /llms.txt, "6. You took a photo with someone on HiRey".
Agent reading this? Full per-host spec: /llms.txt
Questions about permissions, privacy & credentials? Read the FAQ →