Text and effects

await space.send("plain text");
await space.send("🎉", { effect: "confetti" });
await space.send("boom", { effect: "slam" });
Available screen effects include confetti, fireworks, balloons, hearts, lasers, spotlight, echo, slam, and gentle.

Threaded replies

await space.reply(inbound.guid!, "On it — tracking now.");

Tapbacks and reactions

await space.react(inbound.guid!, "love");
await space.react(inbound.guid!, "like", { remove: true });
Named tapbacks: love, like, dislike, laugh, emphasize, question. Any emoji string is also accepted.

Edit and unsend

await space.edit(sent.guid!, "typo fixed");
await space.unsend(sent.guid!);

Typing and read state

await space.typing(true);
await new Promise((r) => setTimeout(r, 800));
await space.typing(false);
await space.read();

Attachments

await space.sendFile({
  path: "/tmp/photo.jpg",
  name: "photo.jpg",
});

await space.sendFile({
  data: fileBytes,
  name: "scan.pdf",
});

Mini-app cards

import { app as card, flow, payment } from "@interactions-hq/skyline";

await space.send(card({
  url: "https://apps.interactions.co.in/demo",
  caption: "Open the demo",
}));

await space.send(flow({
  caption: "Book a slot",
  flow: defineFlow({ /* screens */ }),
}));

await space.send(payment({
  amount: "12.00",
  currency: "USD",
  note: "Coffee",
}));

Availability check

Before messaging a new handle, check iMessage reachability:
const reachable = await space.reachable();
If the handle is not on iMessage, delivery may fall back to SMS/RCS depending on line configuration.

Contact cards

const contact = await space.contact();
if (contact) {
  console.log(contact.fullName, contact.phones);
}

Free plan limitations

FeatureFree plan
DM text + attachments
Reactions, replies, typing, read
Screen effects
Mini-app cards + flows
Group create / rename / avatars
Dedicated line routing