Getting Started Guides
Four common use-cases to get you moving. Each example is available as a REST API call, a CLI command, and a TypeScript SDK snippet — pick the interface that fits your context.
You will need your API key and a connected LinkedIn account (acc_…) before running these. If you have not done that yet, start with Authentication & Accounts.
For the full API surface, see the interactive API reference or the OpenAPI spec.
Send a message
Send a message into an existing chat thread. You need the chat_id of the thread — you can retrieve it from the inbox (GET /v1/chats or curviate inbox list).
curl -X POST https://api.curviate.com/v1/chats/chat_YOUR_CHAT_ID/messages \
-H "Authorization: Bearer cvt_live_…" \
-H "Content-Type: application/json" \
-d '{"text": "Hi! Following up on your message."}'Get a person's profile
Retrieve a LinkedIn member's profile by public identifier, URL, or member ID. The userId is the slug after linkedin.com/in/ — for example williamhgates (or the sentinel "me" for the connected account's own profile). account_id is a path segment, not a query param.
curl "https://api.curviate.com/v1/acc_YOUR_ACCOUNT_ID/users/williamhgates" \
-H "Authorization: Bearer cvt_live_…"curviate profile williamhgates --account acc_YOUR_ACCOUNT_IDimport { Curviate } from "@curviate/sdk";
const curviate = new Curviate({ apiKey: process.env.CURVIATE_API_KEY! });
const profile = await curviate
.account("acc_YOUR_ACCOUNT_ID")
.users.get("williamhgates");
console.log(`${profile.first_name} ${profile.last_name} — ${profile.description}`);Key response fields: first_name, last_name, description (the profile headline — not headline), profile_url, public_identifier.
List new connections
After sending connection requests, call listRelations to see which requests were recently accepted. Each connection item includes a created_at timestamp (ISO-8601) indicating when the connection was established — filter by this field to find new accepts.
# List your 1st-degree connections, sorted by recency
# (the served URL keeps the /profiles/ segment even though the SDK
# namespace is `users` — it is a separate, still-served endpoint)
curl "https://api.curviate.com/v1/acc_YOUR_ACCOUNT_ID/profiles/relations?limit=20" \
-H "Authorization: Bearer cvt_live_…"curviate profile connections --account acc_YOUR_ACCOUNT_ID --limit 20import { Curviate } from "@curviate/sdk";
const curviate = new Curviate({ apiKey: process.env.CURVIATE_API_KEY! });
const page = await curviate
.account("acc_YOUR_ACCOUNT_ID")
.users.listRelations({ limit: 20 });
// Find connections established in the last 24 hours
const cutoff = new Date(Date.now() - 86_400_000).toISOString();
const newConnections = (page.items ?? []).filter(
(c) => c.created_at >= cutoff
);
console.log(`New connections: ${newConnections.length}`);
for (const c of newConnections) {
console.log(` ${c.first_name} ${c.last_name} — connected at ${c.created_at}`);
}Reply as a company page
If your account manages a company page (Beta), you can reply to a message that came in on the page, not just as yourself. Discover the page's inbox, read one of its chat ids, then send into that chat id with the same send-message call you already use. No separate parameter switches identity: the chat id alone decides it, and the response's sent_as field confirms which identity actually sent it. Company pages are reply-only. They can answer an existing conversation but cannot start a new one.
# 1. Discover the company inbox
curl "https://api.curviate.com/v1/acc_YOUR_ACCOUNT_ID/inboxes?kind=company" \
-H "Authorization: Bearer cvt_live_…"
# 2. Read its conversations (use the inbox id from step 1, e.g. COMPANY_83734124_PRIMARY)
curl "https://api.curviate.com/v1/acc_YOUR_ACCOUNT_ID/inboxes/COMPANY_83734124_PRIMARY/chats" \
-H "Authorization: Bearer cvt_live_…"
# 3. Reply with the existing send-message endpoint, using that chat id
curl -X POST https://api.curviate.com/v1/acc_YOUR_ACCOUNT_ID/chats/COMPANY_83734124_2-YTQ3ODU3Njgt/messages \
-H "Authorization: Bearer cvt_live_…" \
-H "Content-Type: application/json" \
-d '{"text": "Thanks for reaching out!"}'# 1. Discover the company inbox
curviate inboxes list --kind company --account acc_YOUR_ACCOUNT_ID
# 2. Read its conversations (use the inbox id from step 1)
curviate inboxes chats COMPANY_83734124_PRIMARY --account acc_YOUR_ACCOUNT_ID
# 3. Reply with the existing message command, using that chat id
curviate message send COMPANY_83734124_2-YTQ3ODU3Njgt "Thanks for reaching out!" \
--account acc_YOUR_ACCOUNT_IDmessage send's default output prints Sent as <name> (company page) to stderr right after the send, so you can see which identity replied without inspecting raw JSON.
The same chat id space works for personal conversations too: a CLASSIC_ chat id sends as the connected member and echoes sent_as: { kind: "personal" }. Never infer the acting identity from a message's sender field, only from sent_as.