Install
openclaw skills install articulerAI-powered professional networking assistant. Generate personalized cold emails and outreach playbooks to accelerate career growth and business development.
openclaw skills install articulerCraft the perfect cold email and build a structured outreach playbook — all driven by your specific professional goal and LinkedIn profile.
Note: Steps 1 and 2 are required before calling any business API. Complete them in order to obtain a
token.
Send a verification code to the user's email address.
curl --location --request POST 'https://api.articuler.ai/user/send-check' \
--header 'Content-Type: application/json' \
--data '{
"email": "your@email.com",
"type": 1
}'
| Field | Type | Description |
|---|---|---|
email | string | The user's email address |
type | integer | Verification type, use 1 for standard check |
The verification code will be sent to the user's inbox. Ask the user to provide the captcha code before proceeding to Step 2.
Log in with the user's email, captcha code, and LinkedIn profile URL. Returns a token required for all subsequent API calls.
curl --location --request POST 'https://api.articuler.ai/user/artclaw/login' \
--header 'Content-Type: application/json' \
--data '{
"email": "your@email.com",
"captcha": "xxxxxx",
"linkedin_url": "https://www.linkedin.com/in/your-profile/"
}'
| Field | Type | Description |
|---|---|---|
email | string | The user's email address |
captcha | string | The verification code received in the user's inbox (from Step 1) |
linkedin_url | string | The user's own LinkedIn profile URL |
{
"token": "xxxxxx"
}
Save the token — it is required for all subsequent API calls.
Submit a playbook generation job for the current user and a target contact. This is an async API — it returns a sessionId immediately. Use Step 4 to poll for the result.
curl --location --request POST 'https://api.articuler.ai/user/artclaw/playbook' \
--header 'Content-Type: application/json' \
--data '{
"token": "xxx",
"target_linkedin_url": "https://www.linkedin.com/in/your-target-profile/",
"objective": "Want to be a partner"
}'
| Field | Type | Description |
|---|---|---|
token | string | Auth token obtained from Step 2 |
target_linkedin_url | string | The target contact's LinkedIn profile URL |
objective | string | The goal of this outreach (e.g. "Want to be a partner") |
{
"code": 0,
"msg": "",
"data": {
"sessionId": "31ee76d4-ab7e-4d5f-8196-f4507ef779b9",
"status": "searching"
}
}
Save the sessionId — it is used to poll for the result in Step 4.
Poll this endpoint repeatedly until status is "done". When done, read the playbook content from the response.
curl --location --request GET 'https://api.articuler.ai/user/artclaw/playbook/info?sess_id=xxx' \
--header 'Content-Type: application/json'
| Field | Type | Description |
|---|---|---|
sess_id | string | The sessionId returned from Step 3 |
data.status === "done"status remains "searching" after 300 seconds, inform the user that generation is taking longer than expected and ask whether to keep waiting{
"code": 0,
"msg": "",
"data": {
"sessionId": "31ee76d4-ab7e-4d5f-8196-f4507ef779b9",
"status": "searching",
"objective": "Want to be a partner",
"playbook": { "subtopics": null },
"doOrNot": { "do": null, "doNot": null }
}
}
{
"code": 0,
"msg": "",
"data": {
"sessionId": "31ee76d4-ab7e-4d5f-8196-f4507ef779b9",
"status": "done",
"objective": "Want to be a partner",
"playbook": {
"subtopics": [
{
"subtopicName": "Absence of Personal Information for Mason Brown",
"insights": [
{
"insight": {
"title": "No Verified Personal Background or Professional Activities Available for Mason Brown",
"content": "Despite extensive search, no confirmed profiles...",
"referenceLinks": []
}
}
]
},
{
"subtopicName": "Monroe Street Partners' Strategic Differentiators",
"insights": [
{
"insight": {
"title": "Non-Traditional Private Equity Model Focused on Long-Term Value",
"content": "Monroe Street Partners (MSP), founded in ...",
"referenceLinks": [
"https://www.monroestreet-partners.com/aboutmsp",
"https://static1.squarespace.com/static/6218510..."
]
}
}
]
}
]
},
"doOrNot": {
"do": [
{
"title": "Discuss Monroe Street Partners' Unique PE Model and Financing Needs",
"contentList": [
"Leverage intelligence about MSP being ..."
]
},
{
"title": "Explore Synergies Between Mason's DCM Experience and MSP's Lower Middle-Market Focus",
"contentList": [
"Mason's background in Debt Capital Markets at PNC..."
]
},
{
"title": "Address Current Private Credit Market Trends Relevant to MSP's Strategy",
"contentList": [
"The industry context shows private credit doubling..."
]
}
],
"doNot": [
{
"title": "Avoid Pushing a Generic \"Off-the-Shelf\" Lending Solution",
"contentList": [
"Monroe Street Partners explicitly differentiates ..."
]
},
{
"title": "Refrain from Unsubstantiated Assumptions about Mason's Booth Studies or Long-Term Career Plans",
"contentList": [
"While Mason is attending Booth, his specific degree..."
]
},
{
"title": "Do Not Undervalue Mason's Role as a Summer Associate",
"contentList": [
"Although a Private Equity Summer Associate role is ..."
]
}
]
}
}
}
Present the playbook.subtopics, doOrNot.do, and doOrNot.doNot to the user in a readable format.
Submit a cold email generation job. Same async pattern as Steps 3–4: returns a sessionId immediately, use Step 6 to poll for the result.
curl --location --request POST 'https://api.articuler.ai/user/artclaw/coldemail' \
--header 'Content-Type: application/json' \
--data '{
"token": "xxx",
"target_linkedin_url": "https://www.linkedin.com/in/your-target-profile/",
"objective": "Want to be a partner"
}'
| Field | Type | Description |
|---|---|---|
token | string | Auth token obtained from Step 2 |
target_linkedin_url | string | The target contact's LinkedIn profile URL |
objective | string | The goal of this cold email (e.g. "Explore investment opportunities") |
{
"code": 0,
"msg": "",
"data": {
"sessionId": "2c6ae07f-bde7-4f6a-8cc6-944a99d742fd",
"status": "searching"
}
}
Save the sessionId — it is used to poll for the result in Step 6.
Poll this endpoint repeatedly until status is "done". When done, read the email content from the response.
curl --location --request GET 'https://api.articuler.ai/user/artclaw/coldemail?sess_id=xxx' \
--header 'Content-Type: application/json'
| Field | Type | Description |
|---|---|---|
sess_id | string | The sessionId returned from Step 5 |
data.status === "done"status remains "searching" after 300 seconds, inform the user that generation is taking longer than expected and ask whether to keep waiting{
"code": 0,
"msg": "",
"data": {
"sessionId": "2c6ae07f-bde7-4f6a-8cc6-944a99d742fd",
"status": "searching",
"objective": "Want to be a partner",
"subject": "",
"coldEmail": ""
}
}
{
"code": 0,
"msg": "",
"data": {
"sessionId": "2c6ae07f-bde7-4f6a-8cc6-944a99d742fd",
"status": "done",
"objective": "Want to be a partner",
"subject": "Exploring a potential partnership",
"coldEmail": "Hi [Name],\n\nI came across your work on..."
}
}
Always show the subject and coldEmail to the user for review before sending. Never auto-send.
Articuler provides an MCP server as an alternative to the REST API above.
Endpoint: https://www.articuler.ai/mcp
| Tool | Description |
|---|---|
generate_cold_email | Generate a personalized cold email given two LinkedIn profiles and an objective |
generate_playbook | Generate a multi-step outreach playbook given two LinkedIn profiles and an objective |
Detect the user's networking intent from their objective to set the right tone and structure:
| Intent | Keywords |
|---|---|
fundraising | 融资、投资人、VC、pre-seed |
hiring | 招聘、合伙人、CTO、团队 |
partnership | 合作、BD、渠道、资源置换 |
research | 了解行业、调研、趋势 |
sales | 客户、企业采购、demo |
objective, the more targeted the output