When to use it
- “Add our Oct 20 dinner in SF to heyBTW, 6 to 9pm.”
- “Here’s the Luma link for next week’s meetup, set it up.”
- “We ran a Partiful event last month. Get it into heyBTW so I can load the guest list.”
- “Create the collab and say who it’s for: VPs of Marketing at Series B fintechs.”
Parameters
Pick ONE door per call.Workflow
There is no preview step: one call creates the collab. Retries are safe because ofclient_request_id.
1
Choose the door
FIELDS door when you have the details (
name, event_start). LINK door when you have a public page (event_url).2
Generate a fresh client_request_id
A new hyphenated UUID for every new create. On a transport error, retry with the SAME id: a committed creation is replayed (
idempotent_replay: true), never repeated. Reusing the id for a different call is refused.3
Read the answer to the user
Read
facts one sentence each, then offer next. If event_end_origin is assumed, tell the person the end is assumed and set it with update_collab once known.4
Carry on with the channel_id
Pass
channel_id unchanged to record_signups, get_event_details, save_event_context, update_collab and every other tool that takes a collab.What the LINK door does
The FIELDS door is
matched too when another collab already has its landing_page_url: that collab comes back as it is, and the values in the call are not applied (use update_collab to change them). A name and a start alone never match.
The event-history ladder
A collab created here sits on rung 2 of the ladder: it brings the event, not its people or partners. Rung 1, an API sync from a connected Luma, Splash or Zuddl account, is better whenever it exists. Every answer lists what this rung leaves out inimport_gaps, each with the tool that fills it:
A collab the Luma integration already synced reports the rung 1 gaps instead (
partners only).
Response
The shape below is from the contract and the code (tools/create_collab.py, collab-write-contract.json). A success was not captured live, because this tool creates a real collab. data[0] opens with the first-value block:
A brand-new collab has no sign-ups, so most facts read 0 or a gap. An empty roster says nothing about who registered.
Rules the agent must follow
- Pick one door per call. Never send
event_nameorevent_dateon input: those are response names. - Never guess a time zone or an offset. Ask the user.
- Read
factsto the user before proposing anything, then offernext. Never recount from the roster. A gap is absent, not zero. - If
possible_duplicatesis not empty, confirm with the person which collab is the real event before adding people to either. - People who registered or attended go to record_signups. People to invite go to import_people, save_list, activate_list: they are not sign-ups.
- An archived match stays archived; a coverage note says so. Tell the user.
Errors and gaps
The validation error, trimmed from a real call with no arguments today:
Related
- update_collab, to fix an assumed end or rename
- record_signups, the next step for a past event
- manage_collab_partners, to fill the
partnersgap - Playbook: Record who registered and who came