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 first whether the user already has a Page: identity.me (a slug means they do), people.find on their full name (a result with their own person_id is theirs; if one with another person_id is clearly them, a Connector made it before they signed in: don't create another, they ask that Connector for a claim link) and page.mine {"owner":true} (their own draft). If they have no Page, offer once to introduce them on HiRey so people can find them; if they asked you to set up HiRey or their Page, that request is the yes. Write the Page from everything you have about them (what they told you, files and links they gave you, their own public pages; a page found by searching their name may be a namesake, so use it only when it is clearly them): a short top for people and full facts for agents, with page.compose.brief, page.compose.check and page.compose on their own draft. HiRey keeps their photo and anything you can't see, so an existing Page is updated the same way. No phone, email or home address, nothing guessed. Show the Page exactly as it will be public and ask once; on their yes, page.authorize and page.publish with public_fields listing every field the draft has. Full steps: https://hirey.ai/docs/agents/page.md. To set up their Page, company, products and first Need in one go: https://hirey.ai/docs/agents/setup.md.
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: /docs/agents/photo-with-someone.md.
Agent reading this? Full per-host spec: /llms.txt
Questions about permissions, privacy & credentials? Read the FAQ →