---
search:
  tags:
    - hours
    - POST
seo:
  description: >-
    Create an hour entry (scope hours:write). Reference for the POST
    /api/v1/hours endpoint in the Basenet Public API.
sidebar:
  label: Create an hour entry (scope hours:write)
  badge: POST
title: Create an hour entry (scope hours:write)
type: openapi-operation
---
Endpoint: `POST /api/v1/hours`

Authentication: `bearerAuth` (Scoped API token (bnx\_…). Required scopes are noted per operation.)

Request body (`application/json`):
- `matterId` (string, required)
- `date` (string, required)
- `workedHours` (number, required)
- `billableHours` (number, optional)
- `description` (string, required)
- `timeClass` (one of `"billable"`, `"internal"`, `"non_billable"`, optional)
- `activityCode` (string, optional)
- `writeOffReason` (string, optional)
- `acknowledgeBillableOverWorked` (boolean, optional)

Responses:
- `201`: Created resource
- `400`: Invalid request
- `401`: Unauthenticated
- `403`: Forbidden (missing scope or permission)
- `429`: Rate limited

Response 201 body (`application/json`):
- `id` (string, required)
- `matterId` (string or null, required)
- `employeeUserId` (string, required)
- `date` (string, required)
- `workedHours` (number, required)
- `billableHours` (number, required)
- `timeClass` (string, required)
- `activityCode` (string or null, required)
- `timekeepingGroup` (string or null, required)
- `description` (string, required)
- `rateCents` (integer or null, required)
- `rateSource` (string or null, required)
- `rateResolutionReason` (string or null, required)
- `invoiceId` (string or null, required)
- `billableOverWorkedConfirmed` (boolean, required)
- `createdAt` (string, required)
- `updatedAt` (string, required)
