Link a thread
opp changes the project (opp_id), link links a record (kind, obj_id), unlink removes a link, dismiss ignores a suggestion. Only the thread's owner, the company owner or an admin may change it.
Authorization
AuthorizationheaderrequiredBearer token: API key (sk_…), OAuth access token (mcp_…) or mobile session (xk_…).
Scope:
crm.writePath parameters
idintegerrequiredThread id.
actionstringrequiredAction.
Values
opplinkunlinkdismissBody application/json
opp_idintegeroptionalProject (
opp).kindstringoptionalRecord type (
link/unlink).obj_idintegeroptionalRecord id.
Errors
| HTTP | error | Meaning |
|---|---|---|
400 | invalid | Missing or invalid field (`message` explains). |
403 | forbidden | You may not see / edit this record. |
404 | not_found | Record not found. |
Request
curl -X POST https://ornek.solk.app/api/v1/threads/1/opp \
-H "Authorization: Bearer $SOLK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"opp_id": 31
}'const res = await fetch("https://ornek.solk.app/api/v1/threads/1/opp", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SOLK_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"opp_id": 31
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://ornek.solk.app/api/v1/threads/1/opp",
headers={"Authorization": f"Bearer {os.environ['SOLK_API_KEY']}"},
json={
"opp_id": 31
},
)
print(r.json())Response
{
"msg": "Yazışma projesi: Mevcut Müşteri — Yenileme · 2026.",
"ok": true,
"thread": {
"companies": [
{
"contacts": [
{
"email": "selin.dogan@alizepaketleme.example",
"id": 1,
"name": "Selin Doğan"
}
],
"id": 1,
"name": "Alize Paketleme San. ve Tic. A.Ş.",
"role": "main"
}
],
"customer": "Alize Paketleme San. ve Tic. A.Ş.",
"customer_id": 1,
"id": 1,
"last_at": "2026-10-01T15:06:59",
"last_dir": "out",
"linkables": [
{
"items": [
{
"id": 74,
"label": "30.09.2026 · Call · Tanışma"
}
],
"kind": "visit",
"klabel": "Ziyaret / görüşme"
}
],
"links": [],
"may_edit": true,
"messages": [
{
"at": "2026-09-30T17:06:59",
"body": "Merhaba Deniz Bey,\n\nNumuneler bize ulaştı, hat denemesini perşembe yapacağız. Aylık 12 ton için güncel fiyatınızı paylaşabilir misiniz?\n\nİyi çalışmalar",
"cc": "",
"dir": "in",
"from_addr": "selin.dogan@alizepaketleme.example",
"from_name": "Selin Doğan",
"hidden": false,
"id": 1,
"subject": "Numune ve fiyat teklifi",
"to": "deniz@ornekkimya.com.tr"
}
],
"n": 2,
"opp": "Mevcut Müşteri — Yenileme · 2026",
"opp_how": "manual",
"opp_id": 31,
"opp_note": "elle seçildi",
"opps": [
{
"id": 44,
"name": "Müşteri Takibi",
"open": true,
"stage_label": "Müşteri Takibi"
}
],
"peer": "selin.dogan@alizepaketleme.example",
"reply": {
"contact_id": 1,
"customer_id": 1,
"in_reply_to": "<a2@mail.ornek>",
"opp_id": 31,
"subject": "Re: Numune ve fiyat teklifi",
"to": "selin.dogan@alizepaketleme.example"
},
"subject": "Numune ve fiyat teklifi",
"suggested": false,
"suggestions": [
{
"date": "2026-09-30",
"how": "",
"id": 74,
"kind": "visit",
"klabel": "Ziyaret / görüşme",
"label": "Call 30.09.2026",
"nav": {
"id": 74,
"kind": "visit",
"screen": "action"
},
"url": "/action/visit/74",
"why": "yazışmayla aynı günlerde görüşme"
}
],
"waiting": false
}
}Example responses were captured from a v22 installation running sample data; lists are shortened to two items.