CompanyFlowHQ API
کسی بھی ویب سائٹ یا ایپ سے لیڈز بھیجیں، اپنے ٹولز سے سوشل میڈیا پر پوسٹ کریں، اور ویب ہکس کے ذریعے کچھ ہوتے ہی اطلاع پائیں۔ Growth، Pro اور Social Agency پلانز میں شامل۔
آغاز
- CompanyFlowHQ میں سیٹنگز ← ڈیولپرز پر جائیں اور ایک API کلید بنائیں۔ صرف وہی اجازتیں منتخب کریں جن کی ضرورت ہے۔
- کلید فوراً کاپی کریں — یہ
cfhq_live_سے شروع ہوتی ہے اور صرف ایک بار دکھائی جاتی ہے۔ - API کو اپنے سرور سے کال کریں (کبھی بھی ایسے ویب صفحے یا ایپ سے نہیں جسے گاہک دیکھ سکے)۔
بنیادی پتہ: https://companyflowhq.com/api/v1۔ درخواستیں اور جوابات JSON (UTF-8) میں ہیں۔ اوقات UTC میں ISO 8601 کے مطابق ہیں۔ رقم سب سے چھوٹی اکائی میں ہے (GBP کے لیے پینس)۔
تصدیق
کلید Authorization ہیڈر میں بھیجیں:
curl https://companyflowhq.com/api/v1/leads -H "Authorization: Bearer cfhq_live_YOUR_KEY"
اجازتیں (اسکوپس):
| اسکوپ | کلید کو اجازت دیتا ہے کہ… |
|---|---|
leads:read | لیڈز پڑھیں |
leads:write | لیڈز شامل اور اپ ڈیٹ کریں، نوٹس شامل کریں |
social:read | سوشل اکاؤنٹس اور پوسٹس پڑھیں |
social:write | سوشل پوسٹس بنائیں اور تصاویر اپ لوڈ کریں |
bookings:read | بکنگز پڑھیں |
invoices:read | انوائسز پڑھیں |
ads:read | Facebook اور Instagram اشتہاری مہمات اور نتائج پڑھیں |
webhooks:manage | ویب ہکس کا انتظام کریں |
hooks:manage | Zapier / Make کے فوری ٹرگرز |
deals:read | ڈیلز پڑھیں |
deals:write | ڈیلز شامل کریں |
invoices:write | انوائسز کے مسودے بنائیں |
messages:send | ای میلز، ٹیکسٹ اور WhatsApp پیغامات بھیجیں |
tickets:write | سپورٹ کی درخواستیں کھولیں |
کلیدیں کسی بھی وقت منسوخ کی جا سکتی ہیں اور ان کی میعاد مقرر کی جا سکتی ہے۔ ہم ہر کلید کا صرف ایک فنگر پرنٹ (SHA-256) محفوظ کرتے ہیں۔
اینڈ پوائنٹس
| طریقہ | راستہ | اسکوپ | یہ کیا کرتا ہے |
|---|---|---|---|
| GET | /api/v1/leads | leads:read | لیڈز کی فہرست، نئی پہلے۔ فلٹرز: stage، email، updated_since۔ |
| POST | /api/v1/leads | leads:write | لیڈ شامل کریں (آپ کے ویب سائٹ فارم جیسی ہی ڈپلیکیٹ جانچ اور خودکار جوابات)۔ |
| GET | /api/v1/leads/{id} | leads:read | ایک لیڈ۔ |
| PATCH | /api/v1/leads/{id} | leads:write | تفصیلات، مرحلہ یا ترجیح بدلیں۔ |
| POST | /api/v1/leads/{id}/notes | leads:write | لیڈ کی ٹائم لائن میں نوٹ شامل کریں۔ |
| GET | /api/v1/social/accounts | social:read | آپ کے جڑے ہوئے سوشل اکاؤنٹس۔ |
| POST | /api/v1/social/posts | social:write | ایک یا زیادہ اکاؤنٹس کے لیے پوسٹ بنائیں: ابھی، کسی وقت پر، قطار کے اگلے وقت میں یا مسودے کے طور پر۔ |
| GET | /api/v1/social/posts/{id} | social:read | پوسٹ کی حالت اور ہر نیٹ ورک پر نتیجہ۔ |
| POST | /api/v1/media | social:write | تصویر اپ لوڈ کریں (JPEG، PNG، WebP یا GIF، 20 MB تک)۔ اس کا id واپس کرتا ہے۔ |
| GET | /api/v1/bookings | bookings:read | بکنگز۔ فلٹرز: from، to، status۔ |
| GET | /api/v1/invoices | invoices:read | بھیجی گئی انوائسز، کوٹیشنز اور کریڈٹ نوٹس۔ فلٹرز: status، kind۔ |
| POST | /api/v1/leads/upsert | leads:write | ای میل یا فون سے لیڈ تلاش کر کے اپ ڈیٹ کریں، یا نئی ہو تو شامل کریں۔ |
| GET | /api/v1/leads/search | leads:read | ?email= یا ?phone= سے لیڈ تلاش کریں۔ |
| POST | /api/v1/leads/{id}/tasks | leads:write | کام شامل کریں (title، due_at، assign_to_email)۔ |
| POST | /api/v1/leads/{id}/sequences | leads:write | خودکار فالو اپ سیکوئنس شروع کریں ({ sequence_id })۔ |
| GET | /api/v1/sequences | leads:read | آپ کے فالو اپ سیکوئنسز۔ |
| POST | /api/v1/messages | messages:send | لیڈ کو ای میل، ٹیکسٹ یا WhatsApp بھیجیں۔ رضامندی، آپٹ آؤٹ اور خاموش اوقات کا احترام کیا جاتا ہے۔ |
| POST | /api/v1/invoices | invoices:write | انوائس یا کوٹیشن کا مسودہ بنائیں (یہ کبھی خود بخود نہیں بھیجی جاتی)۔ |
| GET | /api/v1/invoices/search | invoices:read | ?number= سے انوائس تلاش کریں۔ |
| GET / POST | /api/v1/deals | deals:read / deals:write | ڈیلز کی فہرست دیکھیں یا شامل کریں۔ |
| GET | /api/v1/deals/pipelines | deals:read | ڈیل پائپ لائنز اور ان کے مراحل۔ |
| POST | /api/v1/tickets | tickets:write | سپورٹ کی درخواست کھولیں۔ |
| GET | /api/v1/me | any | آپ کا ورک اسپیس اور کلید کا مالک (کنکشن ٹیسٹ)۔ |
| POST / DELETE | /api/v1/hooks, /api/v1/hooks/{id} | hooks:manage | REST ہکس: کسی ایک واقعے کے لیے URL کو سبسکرائب یا ان سبسکرائب کریں (Zapier اور Make استعمال کرتے ہیں)۔ |
| GET | /api/v1/triggers/{event} | hooks:manage | کسی واقعے کی تازہ ترین اشیاء، ترسیل جیسی ہی شکل میں (?limit=3)۔ |
| GET / POST | /api/v1/webhooks | webhooks:manage | ویب ہکس کی فہرست دیکھیں یا شامل کریں۔ |
| PATCH / DELETE | /api/v1/webhooks/{id} | webhooks:manage | ویب ہک بدلیں، بند کریں یا حذف کریں۔ |
لیڈز کی مثال
لیڈ شامل کریں (curl)
curl -X POST https://companyflowhq.com/api/v1/leads \
-H "Authorization: Bearer cfhq_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: form-2026-09-27-000123" \
-d '{
"first_name": "Amara",
"last_name": "Perera",
"email": "amara@example.com",
"phone": "+44 7700 900123",
"requirement": "MSc Data Science, January intake",
"consent_marketing": true
}'
201 کے ساتھ { "data": { …lead } } واپس کرتا ہے۔ اگر وہ شخص پہلے سے آپ کے ورک اسپیس میں ہے (وہی ای میل یا فون)، تو آپ کو 200 کے ساتھ "duplicate": true اور موجودہ لیڈ ملتی ہے۔ ایک ہی Idempotency-Key دو بار بھیجنے سے کبھی دو لیڈز نہیں بنتیں۔
لیڈ کو اگلے مرحلے میں لے جائیں (JavaScript)
const res = await fetch("https://companyflowhq.com/api/v1/leads/LEAD_ID", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.CFHQ_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ stage: "qualified", priority: "hot" }),
});
if (!res.ok) {
const { error } = await res.json();
throw new Error(`${error.code}: ${error.message}`);
}
const { data: lead } = await res.json();
سوشل پوسٹس کی مثال
پہلے ایک تصویر اپ لوڈ کریں (اختیاری)، پھر پوسٹ بنائیں۔ ہر اکاؤنٹ کا اپنا متن ہو سکتا ہے۔
# 1. Upload a picture
curl -X POST https://companyflowhq.com/api/v1/media \
-H "Authorization: Bearer cfhq_live_YOUR_KEY" \
-F "file=@open-day.jpg"
# → { "data": { "id": "MEDIA_ID", ... } }
# 2. Schedule the post
curl -X POST https://companyflowhq.com/api/v1/social/posts \
-H "Authorization: Bearer cfhq_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Open day this Saturday, 10am to 2pm. Everyone welcome!",
"media_ids": ["MEDIA_ID"],
"accounts": [
{ "account_id": "FACEBOOK_ACCOUNT_ID" },
{ "account_id": "LINKEDIN_ACCOUNT_ID", "text": "Join our open day this Saturday (10:00–14:00)." }
],
"schedule": { "mode": "at", "at": "2026-10-03T08:00:00Z" }
}'
schedule.mode کی قدر now، at، queue (اگلا خالی وقت) یا draft ہوتی ہے۔ اس کے بجائے CompanyFlowHQ میں منظوری کے لیے بھیجنے کو "require_approval": true شامل کریں۔ پوسٹس ایپ جیسے ہی قواعد پر چلتی ہیں، ایجنسیوں کے لیے کلائنٹ کی منظوری سمیت۔ پیش رفت GET /api/v1/social/posts/{id} سے دیکھیں — results ہر نیٹ ورک کی حالت، لنک اور کوئی بھی غلطی بتاتا ہے۔
صفحہ بندی
فہرستیں زیادہ سے زیادہ limit اشیاء واپس کرتی ہیں (طے شدہ 25، زیادہ سے زیادہ 100)، نئی پہلے:
{ "data": [ … ], "has_more": true, "next_cursor": "WyIyMDI2LTA5…" }
اگلا صفحہ لینے کے لیے next_cursor کی قدر کے ساتھ ?cursor= بھیجیں۔ جب has_more کی قدر false ہو تو رک جائیں۔
ویب ہکس
سیٹنگز ← ڈیولپرز میں (یا API سے) ویب ہک شامل کریں۔ کچھ ہونے پر ہم آپ کے HTTPS پتے پر JSON کو POST کرتے ہیں:
| واقعہ | کب |
|---|---|
lead.created | نئی لیڈ آتی ہے |
lead.updated | لیڈ کی تفصیلات یا مرحلہ بدلتا ہے |
booking.created | بکنگ کی جاتی ہے |
invoice.paid | انوائس کی پوری ادائیگی ہوتی ہے |
social.post.published | سوشل پوسٹ شائع ہوتی ہے |
social.post.failed | سوشل پوسٹ ناکام ہوتی ہے |
social.post.milestone | سوشل پوسٹ ویوز کا کوئی سنگِ میل عبور کرتی ہے (1,000، 2,500، 5,000…) |
chat.lead_created | ویب سائٹ چیٹ لیڈ بن جاتی ہے |
lead.stage_changed | لیڈ دوسرے مرحلے میں جاتی ہے |
lead.won | لیڈ کو جیتی ہوئی قرار دیا جاتا ہے |
booking.cancelled | بکنگ منسوخ ہوتی ہے |
quote.accepted | گاہک کوٹیشن قبول کرتا ہے |
deal.won | ڈیل جیتی جاتی ہے |
deal.stage_changed | ڈیل دوسرے مرحلے میں جاتی ہے |
form.response | کوئی فارم یا سروے بھرتا ہے |
ticket.created | سپورٹ کی نئی درخواست آتی ہے |
review.feedback | گاہک نجی رائے دیتا ہے |
message.received | ان باکس میں نیا پیغام آتا ہے |
POST /your-webhook
Content-Type: application/json
X-CompanyFlow-Event: lead.created
X-CompanyFlow-Delivery: 5f0c…
X-CompanyFlow-Signature: t=1790000000,v1=6b1f…
{ "id": "evt_…", "type": "lead.created", "created": "2026-09-27T10:00:00.000Z",
"data": { "lead": { "id": "…", "first_name": "Amara", … }, "source": "Website" } }
10 سیکنڈ کے اندر کوئی بھی 2xx حالت واپس کریں۔ باقی سب ناکامی شمار ہوتا ہے اور ہم 1 منٹ، 5 منٹ، 30 منٹ، 2 گھنٹے اور 12 گھنٹے بعد دوبارہ کوشش کرتے ہیں۔ لگاتار 20 ناکامیوں کے بعد ویب ہک بند کر دیا جاتا ہے اور مالک کو ای میل بھیجی جاتی ہے۔ ری ڈائریکٹس کی پیروی نہیں کی جاتی، اور پتے عوامی ہونے چاہییں (نجی یا مقامی نیٹ ورک نہیں)۔ ایک ہی واقعہ کبھی کبھار دو بار آ سکتا ہے — تکرار نظر انداز کرنے کے لیے id استعمال کریں۔
Zapier اور Make
CompanyFlowHQ کو کوڈ کے بغیر 7,000 سے زیادہ ایپس سے جوڑیں — Xero، QuickBooks، Slack، Google Sheets اور بہت کچھ۔
- سیٹنگز ← ڈیولپرز میں Zapier کلید بنائیں (یا Make کلید بنائیں) دبائیں اور کلید کاپی کریں۔
- Zapier میں CompanyFlowHQ ایپ منتخب کریں اور پوچھے جانے پر کلید پیسٹ کریں۔ Make میں CompanyFlowHQ ایپ شامل کریں (یا
Authorization: Bearer cfhq_live_…ہیڈر کے ساتھ اس کا HTTP ماڈیول استعمال کریں)۔ - نئی لیڈ، انوائس ادا ہو گئی یا ڈیل جیت لی جیسا ٹرگر منتخب کریں، پھر دوسری ایپ میں کوئی کارروائی۔
ٹرگرز فوری ہیں: جب Zap چالو ہوتا ہے تو Zapier POST /api/v1/hooks { "event": "lead.created", "target_url": "https://hooks.zapier.com/…" } سے سبسکرائب کرتا ہے اور بند ہونے پر DELETE /api/v1/hooks/{id} سے ان سبسکرائب کرتا ہے۔ ترسیل ویب ہکس جیسا ہی فارمیٹ، دستخط اور دوبارہ کوشش استعمال کرتی ہے؛ 410 Gone سے جواب دینے پر سبسکرپشن ختم ہو جاتی ہے۔ فعال ٹرگرز آپ سیٹنگز ← ڈیولپرز میں دیکھ اور ہٹا سکتے ہیں۔
دستخطوں کی جانچ
ہر پیغام آپ کے ویب ہک کے خفیہ کوڈ سے دستخط شدہ ہوتا ہے (جو whsec_ سے شروع ہوتا ہے)۔ دستخط <t>.<raw body> کا HMAC-SHA256 ہے۔ اسے ہمیشہ جانچیں، اور 5 منٹ سے پرانے پیغامات مسترد کریں۔
Node.js (Express)
import crypto from "node:crypto";
import express from "express";
const app = express();
app.post("/companyflow-webhook", express.raw({ type: "application/json" }), (req, res) => {
const header = req.get("X-CompanyFlow-Signature") ?? "";
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const expected = crypto
.createHmac("sha256", process.env.CFHQ_WEBHOOK_SECRET)
.update(`${t}.${req.body}`)
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
const ok =
fresh && v1 && v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
if (!ok) return res.status(400).send("Bad signature");
const event = JSON.parse(req.body);
// … handle event.type / event.data …
res.sendStatus(200);
});
Cloudflare Workers / Deno / براؤزرز (Web Crypto)
async function verify(secret, header, rawBody) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const key = await crypto.subtle.importKey(
"raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(`${t}.${rawBody}`));
const hex = [...new Uint8Array(sig)].map((b) => b.toString(16).padStart(2, "0")).join("");
return hex === v1; // use a constant-time compare in production
}
شرح کی حدیں
ہر کلید فی منٹ 120 درخواستیں کر سکتی ہے۔ ہر جواب میں X-RateLimit-Limit اور X-Request-Id ہوتے ہیں۔ حد سے تجاوز پر آپ کو Retry-After ہیڈر کے ساتھ 429 ملتا ہے — اتنے سیکنڈ انتظار کریں اور دوبارہ کوشش کریں۔
غلطیاں
غلطیاں ہمیشہ ایک جیسی دکھتی ہیں:
{ "error": { "code": "insufficient_scope", "message": "This API key doesn't have the “leads:write” permission." } }
| حالت | کوڈ | مطلب |
|---|---|---|
| 400 | invalid_request / invalid_json / invalid_cursor | درخواست میں کچھ ٹھیک کرنا ہے — پیغام بتاتا ہے کیا۔ |
| 401 | unauthorized / revoked / expired | کلید موجود نہیں، غلط ہے، منسوخ ہے یا اس کی میعاد ختم ہو چکی ہے۔ |
| 402 | plan_required | ورک اسپیس کے پلان میں API شامل نہیں۔ |
| 403 | insufficient_scope / key_owner_inactive | کلید کے پاس اجازت نہیں، یا اسے بنانے والا شخص جا چکا ہے۔ |
| 404 | not_found | آپ کے ورک اسپیس میں اس id والی کوئی چیز نہیں۔ |
| 409 | conflict | اسے ابھی بدلا نہیں جا سکتا (مثلاً پہلے سے شائع شدہ پوسٹ)۔ |
| 413 | payload_too_large | JSON باڈی 256 KB سے کم ہونی چاہیے؛ تصاویر 20 MB سے کم۔ |
| 415 | unsupported_media_type | JPEG، PNG، WebP یا GIF اپ لوڈ کریں۔ |
| 429 | rate_limited | فی منٹ 120 سے زیادہ درخواستیں۔ Retry-After جتنے سیکنڈ انتظار کریں۔ |
| 500 | server_error | ہماری غلطی۔ دوبارہ کوشش کریں؛ بار بار ہو تو X-Request-Id بتائیں۔ |
سوالات؟ support@companyflowhq.com پر ای میل کریں۔
