POST /rest/v1.1/projects/{project_id}/project_timecard_entries/bulk_create
Create multiple timecard entries in a single transaction.
Servers
- https://api.procore.com
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
project_id |
Integer | Yes |
Unique identifier for the project. |
Request headers
| Name | Type | Required | Description |
|---|---|---|---|
Content-Type |
String | Yes |
The media type of the request body.
Default value: "application/json" |
Procore-Company-Id |
Integer | Yes |
Unique company identifier associated with the Procore User Account. |
Request body fields
| Name | Type | Required | Description |
|---|---|---|---|
timecard_entries[] |
Array | Yes |
Array of timecard entries to be created in bulk (maximum 25 entries). |
timecard_entries[].lunch_time |
String | No |
Lunch break duration in minutes. Can be provided directly by the client, or will be automatically calculated when both lunch_start_time and lunch_stop_time are provided. Cannot be greater than total work duration. |
timecard_entries[].line_item_type_id |
Integer | No |
The ID of the line item type for this timecard entry. DO NOT provide if providing a wbs_code_id, as they are mutually exclusive. This represents construction contract line item classification for direct contract billing and change order tracking. It maps labor time to specific contract deliverables or bid line items and is used for progress billing and client invoicing based on contract structure. Works with traditional cost code systems but not with modern WBS/Task code approaches. See List Line Item Types to retrieve available line item types for your company. |
timecard_entries[].description |
String | No |
A description of the work performed during this timecard entry. |
timecard_entries[].clock_in_id |
Integer | No |
ID of GPS position record for clock-in event. Must be unique per worker within company to prevent duplicate clock-ins and cannot equal clock_out_id. |
timecard_entries[].clock_in_time |
String | No |
Actual timestamp when worker clocked in via GPS or kiosk. This is the raw, unrounded time as recorded by the system. Company rounding rules are applied to this timestamp to calculate the time_in value, which is then used for hours calculations. See Show Rounding Configuration to retrieve your company's rounding rules. |
timecard_entries[].lunch_stop_time |
String | No |
The datetime when lunch break ended, in ISO 8601 format. When both lunch_start_time and lunch_stop_time are provided, the system automatically calculates and updates the lunch_time field with the duration. |
timecard_entries[].date |
String | No |
The date this work was performed, in YYYY-MM-DD format. |
timecard_entries[].origin_data |
String | No | |
timecard_entries[].custom_field_%{custom_field_definition_id} |
String | No |
Custom field values where %{custom_field_definition_id} is replaced with the actual ID. These are construction-specific data fields customized per company needs, such as equipment used, weather conditions, or safety incidents. Common examples include equipment tracking, safety notes, work orders, weather conditions, union local numbers, and certification requirements. Available in MyTime and Project Timesheet contexts with different field sets based on workflow. Often used for regulatory compliance data like safety training, certifications, or environmental conditions. See List Custom Field Definitions with |
timecard_entries[].updated_at |
String | No |
When the timecard entry was last updated. This represents construction timecard modification tracking for audit trails and change management, and is critical for resolving wage disputes and demonstrating proper record-keeping. |
timecard_entries[].id |
Integer | No |
Unique identifier for the timecard entry. |
timecard_entries[].approval_date |
String | No |
The date when this timecard entry was approved, in YYYY-MM-DD format. Only set when approval_status is 'approved'. |
timecard_entries[].origin_id |
String | No | |
timecard_entries[].billable |
Boolean | No |
Whether this time can be charged to the client. The API defaults to false if not specified, but the UI defaults new entries to true. Default value: false |
timecard_entries[].timecard_time_type_id |
Integer | No |
The ID of the timecard time type (e.g., Regular Time, Overtime, Double Time). This directly affects hourly rate multipliers and overtime premium calculations. See List Timecard Time Types to retrieve available timecard time types for your company. |
timecard_entries[].project_id |
Integer | Yes |
The ID of the project this timecard entry belongs to. |
timecard_entries[].time_out |
String | No |
End time used for calculating hours worked. This is the clock_out_time after company rounding rules have been applied. This rounded time is what gets used in the actual hours calculation, not the original clock_out_time. See Show Rounding Configuration to retrieve your company's rounding rules. |
timecard_entries[].timesheet_id |
Integer | No |
The ID of the timesheet to associate this timecard entry with. All entries in a bulk request typically belong to the same timesheet. Construction timesheets represent a collection of time entries for a specific period, usually weekly. Timesheets go through a foreman/supervisor approval process before payroll processing, and multiple timecard entries are typically grouped under a single timesheet for batch processing. See List Timesheets to retrieve available timesheets for your project. |
timecard_entries[].sub_job_id |
Integer | No |
The ID of the sub job this timecard entry is associated with. This is legacy - don't use if you have WBS codes. Used for more granular project cost tracking and reporting. This represents construction project subdivision for detailed cost control, such as Building A versus Building B or Phase 1 versus Phase 2. It enables separate cost tracking for different contract phases or building components and allows separate billing and progress reporting for distinct project phases or structures. Modern projects should use wbs_code_id instead for better task-based tracking. See List Sub Jobs to retrieve available sub jobs for the project. |
timecard_entries[].time_in |
String | No |
Start time used for calculating hours worked. This is the clock_in_time after company rounding rules have been applied. This rounded time is what gets used in the actual hours calculation, not the original clock_in_time. See Show Rounding Configuration to retrieve your company's rounding rules. |
timecard_entries[].lunch_clock_in_id |
Integer | No |
ID of GPS record for lunch clock-in event. See List GPS Positions. |
timecard_entries[].signed |
Boolean | No |
Whether this timecard entry has been digitally signed by the worker. This represents a digital signature requirement for construction timecard legal compliance and dispute prevention. It provides legal proof of worker acknowledgment for wage and hour dispute protection and is often required by construction union agreements for timecard validity. Digital signatures must be enabled and this field is related to procore_signature_id when digital signatures are captured. See List Signatures. |
timecard_entries[].set_timecard_time_type_automatically |
Boolean | No |
Automatically calculates overtime based on company rules. Only applies when completing an in-progress timecard entry or creating a non-in-progress entry. May split entry into multiple time types. A single 12-hour entry may automatically split into 8 hours regular plus 4 hours overtime. This ensures construction time entries comply with complex union overtime rules and prevailing wage requirements. The company must have overtime management enabled with configured rulesets. When true, timecard_time_type_id will be ignored and can be omitted. See List Overtime Rulesets and List Timecard Time Types for setup. |
timecard_entries[].split_parent_id |
Integer | No |
The ID of the parent timecard entry when this entry was created by Overtime Management. This only shows up when the timecard entry is created the first time. |
timecard_entries[].hours |
String | No |
Total hours worked for this timecard entry, excluding breaks. Required for hours-based timesheets. Must be numeric with a maximum of 24 hours per entry. When both time_in and time_out are provided, this value is automatically calculated from those times minus any lunch_time duration, and any supplied hours value will be ignored. If time_in and time_out are not provided, you must supply this value directly. |
timecard_entries[].clock_out_id |
Integer | No |
ID of GPS position record for clock-out event. Must be unique per worker within company to prevent duplicate clock-outs. |
timecard_entries[].in_progress |
Boolean | No |
Whether this entry represents an active work session. In-progress timecard entries generally do not appear in API responses unless specifically requested using the include_in_progress filter. Default value: false |
timecard_entries[].party_id |
Integer | No |
The ID of the person/party who performed this work. This identifies the worker for the timecard entry and represents construction worker identification in the Procore system. Can represent employees, subcontractors, or vendors. Links time entries to specific workers for payroll processing and labor cost allocation. A single party can work across multiple projects and companies within the system. See List Timesheet Parties to retrieve available parties/workers for your company. |
timecard_entries[].company_id |
Integer | No |
The ID of the company this timecard entry belongs to. |
timecard_entries[].approval_status |
String | No |
Current approval status of the timecard entry. Valid values:
Default value: "pending" |
timecard_entries[].lunch_clock_out_id |
Integer | No |
ID of GPS record for lunch clock-out event. See List GPS Positions. |
timecard_entries[].work_classification_id |
Integer | No |
The ID of the work classification that categorizes the type of work performed (e.g., Carpenter, Electrician, Laborer). This construction trade classification system tracks skilled labor types and wage rates, often aligning with union trade classifications for proper wage and benefit calculations. It enables analysis of labor mix and skill requirements across construction projects and is critical for public works projects requiring specific trade wage rates. See List all classifications to retrieve available work classifications for your project. |
timecard_entries[].location_id |
Integer | No |
The ID of the location where this work was performed. Used for job site tracking and reporting. This represents a specific construction site location within a project, such as Building A, Floor 3, or Parking Lot. Large construction projects often have multiple work locations requiring separate tracking. This enables location-specific safety reporting and emergency response procedures. See List Project Locations to retrieve available locations for your project. |
timecard_entries[].wbs_code_id |
Integer | No |
The ID of the Work Breakdown Structure (Task Code) for this timecard entry. This is the preferred modern approach over cost_code_id. In the timecard context, "WBS code" specifically refers to Task Codes - the modern construction project task hierarchy that represents specific construction tasks or activities rather than generic cost categories. This directly links labor time to project schedule tasks for better progress tracking and is the modern replacement for traditional cost codes, providing more granular project control. See List Project WBS Task codes to retrieve available task codes for your project. |
timecard_entries[].crew_id |
Integer | No |
The ID of the crew this timecard entry is associated with. Used for crew-based time tracking and reporting. This represents construction work crew organization for team-based labor tracking and productivity analysis. Crews are typically managed by foremen who approve timesheets and track crew productivity. This enables crew-based scheduling and resource allocation across construction projects. See List all Project Crews to retrieve available crews for your project. |
timecard_entries[].lunch_start_time |
String | No |
The datetime when the lunch break started, in ISO 8601 format. |
timecard_entries[].deleted_at |
String | No |
When the timecard entry was deleted (if applicable). This represents construction timecard soft deletion for maintaining audit trails while removing erroneous entries. It preserves a record of deleted entries for regulatory compliance and audit requirements. |
timecard_entries[].created_at |
String | No |
When the timecard entry was created. This provides a construction timecard audit trail for legal compliance and dispute resolution, and provides evidence of when time was originally recorded for wage and hour law compliance. |
timecard_entries[].clock_out_time |
String | No |
Actual timestamp when worker clocked out via GPS or kiosk. This is the raw, unrounded time as recorded by the system. Company rounding rules are applied to this timestamp to calculate the time_out value, which is then used for hours calculations. See Show Rounding Configuration to retrieve your company's rounding rules. |
timecard_entries[].cost_code_id |
Integer | No |
The ID of the cost code for this work. DO NOT provide if providing a wbs_code_id, as they are mutually exclusive. This represents the traditional construction cost accounting system for tracking labor costs against budget line items. This older approach to construction cost tracking is being replaced by WBS/Task codes in modern projects but still links labor hours directly to original project budget estimates for cost control. Cannot be used with wbs_code_id as they represent different cost tracking methodologies. See List Cost Codes to retrieve available cost codes for your project. |
timecard_entries[].approved_by_id |
Integer | No |
The ID of the user who approved this timecard entry. |
How to start integrating
- Add HTTP Task to your workflow definition.
- Search for the API you want to integrate with and click on the name.
- This loads the API reference documentation and prepares the Http request settings.
- Click Test request to test run your request to the API and see the API's response.