API Reference
Get Close Public API
Powered by Closing Signals™ technology. Read-only access to your proposals, closing signals, and deal pipeline. Register webhooks to get notified in real time.
Base URL: https://www.getclose.so/api/v1
Authentication
All requests require a Bearer token in the Authorization header. Generate API keys in Settings → API.
Authorization: Bearer gc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Security: Your API key grants read access to all your proposals and signals. Never share it, commit it to version control, or expose it in client-side code.
Rate Limits
60 requests per minute per API key. Exceeding the limit returns 429 with a Retry-After header.
Endpoints
GET /api/v1/proposals
Returns all non-archived proposals for the authenticated user.
curl -H "Authorization: Bearer gc_live_xxx" \
https://www.getclose.so/api/v1/proposals
{
"proposals": [
{
"id": "uuid",
"client_name": "Sarah Mitchell",
"client_company": "Meridian Network",
"status": "viewed",
"total_value": 75000,
"view_count": 4,
"scroll_depth": 92,
"pricing_views": 3,
"engagement_score": 87,
"created_at": "2026-03-28T14:30:00Z"
}
]
}
GET /api/v1/proposals/:id
Returns detail for a single proposal. Returns 404 if not found or not owned by the authenticated user.
curl -H "Authorization: Bearer gc_live_xxx" \
https://www.getclose.so/api/v1/proposals/{id}
GET /api/v1/proposals/:id/signals
Returns closing signals for a specific proposal — section times, scroll depth, pricing views, engagement score, and alert timestamps.
{
"section_times": {
"Executive Summary": 45,
"Investment": 340,
"Scope of Work": 120
},
"scroll_depth": 92,
"pricing_views": 4,
"last_section": "Investment",
"engagement_score": 87,
"last_hot_alert_at": "2026-03-28T21:15:00Z",
"last_cold_signal_at": null
}
GET /api/v1/deals
Returns a pipeline summary — proposals by status, total value, active hot moments and cold signals.
{
"total_proposals": 7,
"by_status": { "draft": 1, "sent": 2, "viewed": 3, "accepted": 1 },
"total_pipeline_value": 245000,
"hot_moments_active": 1,
"cold_signals_active": 2,
"average_engagement_score": 54
}
POST /api/v1/webhooks
Register a webhook endpoint. URL must be HTTPS. The signing secret is returned once — save it immediately.
curl -X POST -H "Authorization: Bearer gc_live_xxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/webhook","events":["proposal.opened","hot_moment.fired"]}' \
https://www.getclose.so/api/v1/webhooks
Available events: proposal.opened · proposal.signed · hot_moment.fired · cold_signal.triggered · drip.completed
DELETE /api/v1/webhooks/:id
Deactivate a webhook endpoint.
Verifying Webhook Signatures
Every webhook request includes an X-GetClose-Signature header. Verify it using HMAC-SHA256 with your signing secret.
// Node.js verification example
const crypto = require('crypto');
function verifySignature(body, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return signature === `sha256=${expected}`;
}
// In your webhook handler:
app.post('/webhook', (req, res) => {
const sig = req.headers['x-getclose-signature'];
const raw = JSON.stringify(req.body);
if (!verifySignature(raw, sig, YOUR_SIGNING_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Process the event
const { event, data } = req.body;
console.log(`Received: ${event}`, data);
res.sendStatus(200);
});
Error Codes
401Unauthorized — invalid, revoked, or missing API key404Not found — resource does not exist or is not owned by you429Rate limited — 60 requests per minute exceeded500Internal error — contact support@getclose.so