Skip to main content

Getting Started with the Buddy Punch Developer API

How to enable the Developer API, create an API key and set permissions, and connect to the Buddy Punch Public API.

View in Help Center/New Window

Overview: The Buddy Punch Developer API lets you connect your own software to Buddy Punch to read and manage employees, punches, time entries, time off, schedules, and more - so you can automate data syncs, build custom reports, or integrate Buddy Punch with the other tools your team uses.

This guide is for account Administrators and walks you through enabling the API, creating an API key with the right permissions, and making your first authenticated request.

Important: The new Developer API is served from api2.buddypunch.com.

Instructions:


Before you begin

You'll need two things in place:

  • You're signed in as an Administrator on the Buddy Punch account. (Managers and employees can't create API keys.)

  • The Developer API is enabled on your account. If you don't see it under Settings --> Integrations, reach out to our support team, and we'll turn it on for you.

Step 1: Log in to Buddy Punch as an Administrator, then go to Settings --> Integrations. Search for or scroll to the Developer API card and click the blue Manage API Keys button:

Step 2: The API Keys page lists any keys you've already created, along with each key's name, key prefix, permissions, status, last-used date, and creation date. From here, click + Create New API Key:

Step 3: Give your key a clear Key Name (for example, "Production Integration") so you can recognize it later. Then set the Permissions for the key.

Each resource can be granted Read and/or Write access. Use Select All (Full Access) to grant everything, or check only the specific resources your integration needs. As a best practice, grant the smallest set of permissions your integration actually requires - you can always create another key later if your needs grow:

Step 4: After you create the key, the full API key is shown only once. Copy it immediately and store it somewhere secure - you won't be able to view it again. If you lose a key, simply revoke it from the API Keys page and create a new one.

Important! Keep your key secure!

  • Treat your API key like a password - anyone with it can access your account's data within the key's permissions.

  • Store it in a secrets manager or environment variable; never hard-code it into client-side or shared code.

  • Use separate keys for separate integrations so you can revoke one without disrupting the others.

  • Revoke any key that's no longer used or may have been exposed, and create a replacement.


Using your API key

Base URL

All requests go to:

https://api2.buddypunch.com

Authentication

Every request must include your API key as a Bearer token in the Authorization request header, in the form Authorization: Bearer YOUR_API_KEY. Ready-to-run request examples in curl, Node.js, Python, and C# are available in the interactive documentation (linked at the bottom of this article).

If the key is missing or invalid, you'll receive a 401 response. If the key is valid but lacks the permission scope an endpoint requires, you'll receive a 403.

API versioning

Pin a version by sending an X-Api-Version header (for example, X-Api-Version: 2025-03-01) so your integration keeps working when newer versions ship. Watch the Changelog in the documentation for breaking changes.

Permission scopes

Each API key carries a set of scopes in the form {resource}:read or {resource}:write. A request is rejected with a 403 if the key lacks the scope the endpoint requires.

Available scopes include:

Resource

Read scope

Write scope

Employees

employees:read

employees:write

Punches

punches:read

punches:write

Time Entries

timeentries:read

timeentries:write

Time Off

pto:read

pto:write

Time Cards

timecards:read

timecards:write

Pay Periods

payperiods:read

payperiods:write

Locations

locations:read

locations:write

Department Codes

departmentcodes:read

departmentcodes:write

Positions

positions:read

positions:write

Groups

groups:read

groups:write

Geofences

geofences:read

geofences:write

Webhooks

webhooks:read

webhooks:write

Pagination

List endpoints use cursor-based pagination. Use limit (1–100, default 25) to control page size, and startingAfter / endingBefore with an item ID as a cursor. Responses are wrapped in an envelope:

{
  "object": "list",
  "data": [ ... ],
  "hasMore": true,
  "totalCount": 142,
  "url": "/employee"
}

Rate limits

Per-minute rate limits are applied per account using a sliding window, and the ceiling depends on your Buddy Punch plan:

Plan tier

Per-account limit

Trial/non-paying

60 requests/minute

Paid non-Enterprise (Starter / Pro )

600 requests/minute

Enterprise

1,000 requests/minute

When you hit a limit, you'll get a 429 Too Many Requests response. Check the Retry-After header for how many seconds to wait, then retry - and back off exponentially on repeated failures. Trial accounts also have additional per-resource caps, daily write caps, and a one-active-key limit.

Errors

All errors follow a consistent JSON envelope:

{
  "error": {
    "type": "invalid_request_error",
    "code": "resource_not_found",
    "message": "Employee 999 not found.",
    "requestId": "req_abc123"
  }
}

Status

Type

Meaning

400

invalid_request_error

Missing or invalid parameters

401

authentication_error

Invalid or missing API key

403

authorization_error

Key lacks the required permission scope

404

invalid_request_error

Resource not found

409

invalid_request_error

Idempotency conflict

429

rate_limit_error

Rate limit exceeded

500

api_error

Internal server error

Include the requestId from an error response when contacting support - it helps us track down what happened.


Full API documentation

Complete, interactive documentation - including every endpoint, the full data model, idempotency, webhooks, code examples (curl, Node.js, Python, C#), and the migration guide for moving off the legacy API - is available at: https://api2.buddypunch.com/docs/

Did this answer your question?