Skip to main content

API Access

Programmatic access to Harmony's data and features.

Overview

The Harmony API enables:

  • Custom integrations
  • Automated workflows
  • Data export and analysis
  • Third-party app connections
  • Enterprise automation

Getting Started

API Access Requirements

📝 ASSUMPTION: API access may require specific plan levels:

PlanAPI Access
SoloLimited
PlusStandard
MaxFull
EnterpriseFull + Custom

Getting API Credentials

  1. Go to SettingsIntegrationsAPI
  2. Click Generate API Key
  3. Copy your API key securely
  4. Never share or expose your key

API Key Security

  • Store securely (environment variables, secrets manager)
  • Never commit to code repositories
  • Rotate periodically
  • Revoke if compromised

Authentication

API Key Authentication

Include your API key in requests:

Authorization: Bearer YOUR_API_KEY

OAuth 2.0

For user-context integrations:

Authorization: Bearer USER_ACCESS_TOKEN

API Endpoints

Meetings

EndpointMethodDescription
/api/v1/meetingsGETList meetings
/api/v1/meetings/{id}GETGet meeting details
/api/v1/meetings/{id}/transcriptGETGet transcript
/api/v1/meetings/{id}/summaryGETGet summary
/api/v1/meetings/{id}/insightsGETGet insights

Contacts

EndpointMethodDescription
/api/v1/contactsGETList contacts
/api/v1/contacts/{id}GETGet contact details
/api/v1/contacts/{id}/meetingsGETContact's meetings

Insights

EndpointMethodDescription
/api/v1/insightsGETList insights
/api/v1/insights/{id}GETGet insight details
/api/v1/insights/{id}/dataGETGet insight data

Upload

EndpointMethodDescription
/api/v1/meetings/uploadPOSTUpload recording
/api/v1/meetings/{id}/statusGETCheck processing status

Example Requests

List Meetings

curl -X GET "https://api.heyharmony.com/v1/meetings" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"

Response:

{
"data": [
{
"id": "mtg_abc123",
"title": "Sales Call - Acme Corp",
"date": "2026-02-01T14:00:00Z",
"duration": 1800,
"status": "processed"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 150
}
}

Get Meeting Transcript

curl -X GET "https://api.heyharmony.com/v1/meetings/mtg_abc123/transcript" \
-H "Authorization: Bearer YOUR_API_KEY"

Response:

{
"meeting_id": "mtg_abc123",
"transcript": [
{
"speaker": "John Smith",
"text": "Thanks for joining today.",
"timestamp": "00:00:05"
}
]
}

Upload a Recording

curl -X POST "https://api.heyharmony.com/v1/meetings/upload" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]" \
-F "title=Customer Call" \
-F "date=2026-02-01T10:00:00Z"

Pagination

For list endpoints, use pagination:

GET /api/v1/meetings?page=2&per_page=50

Parameters:

ParameterDefaultMax
page1-
per_page20100

Filtering

Filter results with query parameters:

GET /api/v1/meetings?date_from=2026-01-01&date_to=2026-01-31&status=processed

Common filters:

FilterDescription
date_fromStart date
date_toEnd date
statusProcessing status
team_idSpecific team
user_idSpecific user

Webhooks

Available Events

Receive notifications when events occur:

EventTrigger
meeting.startedRecording began
meeting.processedProcessing complete
meeting.failedProcessing failed
insight.generatedInsight created

Setting Up Webhooks

  1. Go to SettingsIntegrationsWebhooks
  2. Click Add Webhook
  3. Enter your endpoint URL
  4. Select events to receive
  5. Save

Webhook Payload

{
"event": "meeting.processed",
"timestamp": "2026-02-01T15:30:00Z",
"data": {
"meeting_id": "mtg_abc123",
"title": "Sales Call",
"duration": 1800
}
}

Webhook Security

Verify webhook signatures:

  1. Get the signature from X-Harmony-Signature header
  2. Compute HMAC-SHA256 of request body
  3. Compare signatures

Rate Limits

Default Limits

PlanRequests/Minute
Plus60
Max300
EnterpriseCustom

Rate Limit Headers

Response includes:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1706803200

Handling Rate Limits

If you exceed limits:

  • HTTP 429 response
  • Wait until reset
  • Implement exponential backoff

Error Handling

Error Format

{
"error": {
"code": "not_found",
"message": "Meeting not found",
"details": {}
}
}

Common Errors

CodeStatusDescription
unauthorized401Invalid API key
forbidden403Insufficient permissions
not_found404Resource not found
rate_limited429Too many requests
server_error500Internal error

SDKs and Libraries

Official SDKs

📝 ASSUMPTION: SDK availability may vary:

  • Python SDK
  • Node.js SDK
  • Ruby SDK

Community Libraries

Check our GitHub for community-maintained libraries.

Use Cases

Automated Reporting

# Get last week's meetings
meetings = harmony.meetings.list(
date_from="2026-01-25",
date_to="2026-02-01"
)

# Generate report
for meeting in meetings:
insights = harmony.meetings.get_insights(meeting.id)
# Process and report

Data Warehouse Sync

# Export all meetings to data warehouse
meetings = harmony.meetings.list()
for meeting in meetings:
transcript = harmony.meetings.get_transcript(meeting.id)
warehouse.insert("meetings", meeting, transcript)

Custom Notifications

# Webhook handler
@app.route("/webhook", methods=["POST"])
def handle_webhook():
event = request.json
if event["event"] == "meeting.processed":
send_slack_notification(event["data"])
return "OK"

Best Practices

1. Use Pagination

Always paginate large result sets:

all_meetings = []
page = 1
while True:
response = api.meetings.list(page=page)
all_meetings.extend(response.data)
if not response.has_more:
break
page += 1

2. Handle Errors Gracefully

Implement retry logic:

import time

def api_call_with_retry(func, max_retries=3):
for attempt in range(max_retries):
try:
return func()
except RateLimitError:
time.sleep(2 ** attempt)
raise Exception("Max retries exceeded")

3. Cache When Possible

Reduce API calls:

# Cache meeting data locally
if not cache.has(meeting_id):
meeting = api.meetings.get(meeting_id)
cache.set(meeting_id, meeting)

API Documentation

Full API documentation:

📝 API Reference (placeholder)

Support

For API support:

  • Documentation: api.heyharmony.com/docs
  • Email: [email protected]
  • Status: status.heyharmony.com