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
}'
{ "data": { …lead } } உடன் 201 திரும்பும். அந்த நபர் ஏற்கெனவே உங்கள் பணியிடத்தில் இருந்தால் (அதே மின்னஞ்சல் அல்லது தொலைபேசி), "duplicate": true மற்றும் ஏற்கெனவே உள்ள லீடுடன் 200 கிடைக்கும். அதே 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 முகவரிக்கு மின்னஞ்சல் அனுப்புங்கள்.
