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

Questions? Contact support@getclose.so