REST API Reference
Complete reference for the IceCubes REST API. All endpoints require API key authentication.
Base URL: https://icecubes-app.fly.dev/api/public
Include your API key in every request:
Authorization: Bearer ik_a1b2c3d4_e5f6789012345678901234567890abcdef01234567
GET /api/public/user
Returns your user profile and meeting statistics.
curl https://icecubes-app.fly.dev/api/public/user \ -H "Authorization: Bearer YOUR_API_KEY"
Response:
{
"id": "user123",
"email": "you@company.com",
"displayName": "Your Name",
"organizationId": "org123",
"meetingCount": 42,
"createdAt": "2024-01-15T10:00:00.000Z"
}GET /api/public/meetings
List and search your meetings.
| Parameter | Type | Description |
|---|---|---|
limit | number | Max results (default 20, max 100) |
offset | number | Skip N results for pagination |
keyword | string | Search by meeting title |
from | ISO date | Meetings after this date |
to | ISO date | Meetings before this date |
participant | string | Filter by participant email |
scope | string | personal (default) or org to include team meetings |
tag | string | Filter by tag ID |
hubspot_deal_id | string | Filter by HubSpot deal ID. Requires HubSpot connected. |
salesforce_opportunity_id | string | Filter by Salesforce opportunity ID. Requires Salesforce connected. |
curl "https://icecubes-app.fly.dev/api/public/meetings?limit=5&from=2024-06-01" \ -H "Authorization: Bearer YOUR_API_KEY"
Each meeting in the response includes a crmSync field (or null) with linked CRM deal/opportunity info:
"crmSync": {
"hubspot": {
"dealId": "12345",
"dealName": "Pinnacle Corp - Enterprise",
"dealStage": "negotiation"
}
}CRM filter params require the corresponding CRM integration to be connected to your organization. If you use hubspot_deal_id but only Salesforce is connected, you will receive a 400 error with guidance.
GET /api/public/meetings/:id
Get full meeting details including AI summary, key points, and action items.
curl https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/meetings/:id/transcript
Get the full transcript with speaker names and timestamps.
curl https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/transcript \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/meetings/:id/insights
Get AI-extracted sales insights for a meeting.
| Parameter | Type | Description |
|---|---|---|
category | string | Filter by category: next_step, objection_budget, objection_authority, objection_need, objection_time, pricing, challenge, meddic_metrics, meddic_economic_buyer, meddic_decision_criteria, meddic_decision_process, meddic_identify_pain, meddic_champion |
curl "https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/insights?category=pricing" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/meetings/:id/notes
Get meeting notes.
curl https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/notes \ -H "Authorization: Bearer YOUR_API_KEY"
Response:
{
"content": "Meeting notes...",
"updatedAt": "...",
"version": 3
}PUT /api/public/meetings/:id/notes
Update meeting notes.
curl -X PUT https://icecubes-app.fly.dev/api/public/meetings/MEETING_ID/notes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"Updated notes content"}'GET /api/public/action-items
List action items across all meetings or for a specific meeting.
| Parameter | Type | Description |
|---|---|---|
limit | number | Max results (default 20, max 100) |
offset | number | Skip N results for pagination |
meetingId | string | Filter by meeting |
completed | boolean | Filter by completion status |
curl "https://icecubes-app.fly.dev/api/public/action-items?completed=false&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
POST /api/public/action-items
Create a new action item.
| Field | Type | Description |
|---|---|---|
meetingId | string | Required. The meeting ID. |
text | string | Required. Action item text. |
assigneeEmail | string | Optional. Assignee email. |
dueDate | ISO date | Optional. Due date. |
curl -X POST https://icecubes-app.fly.dev/api/public/action-items \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"meetingId":"abc123","text":"Follow up with client about pricing"}'PATCH /api/public/action-items/:id
Update an action item. All body fields are optional.
| Field | Type | Description |
|---|---|---|
completed | boolean | Mark as complete/incomplete |
text | string | Updated text |
assigneeEmail | string | Updated assignee |
dueDate | ISO date | Updated due date |
curl -X PATCH https://icecubes-app.fly.dev/api/public/action-items/ITEM_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"completed":true}'GET /api/public/search
Full-text search across transcripts, summaries, action items, notes, and key points.
| Parameter | Type | Description |
|---|---|---|
q | string | Search query (required) |
type | string | Filter: transcript, summary, action_item, decision, note, key_point |
speaker | string | Filter by speaker name |
limit | number | Max results (default 20, max 50) |
offset | number | Skip N results for pagination |
curl "https://icecubes-app.fly.dev/api/public/search?q=competitor+pricing&type=transcript&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/contacts
List contacts from your meetings.
| Parameter | Type | Description |
|---|---|---|
search | string | Search by name or email |
domain | string | Filter by email domain |
limit | number | Max results (default 25, max 100) |
cursor | string | Pagination cursor from previous response |
curl "https://icecubes-app.fly.dev/api/public/contacts?search=john&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/public/tags
List all available tags (organization and personal).
curl https://icecubes-app.fly.dev/api/public/tags \ -H "Authorization: Bearer YOUR_API_KEY"
Error Handling
All errors follow a consistent JSON format:
{
"error": {
"code": "not_found",
"message": "Meeting not found"
}
}| HTTP Status | Code | Description |
|---|---|---|
| 401 | unauthorized | Missing, invalid, or revoked API key |
| 403 | forbidden | Not authorized to access this resource |
| 404 | not_found | Resource not found |
| 500 | internal_error | Server error |