ProjectsCreate a project from a template

Create a project from a template

Creates a new project by copying a project template, and returns it.

Copies the template's task plan, milestones, resource group, contracts and payment plan into a new project and overrides name, customer, people, dates, type, category, currency and legal entity from the body. The project manager (and the milestone assignee, when the template has milestones) is added as a project resource. The status and time-registration flag come from the template. Answers 200 with the new project (ProjectRead). Only available when the account's ProjectManagerToolbox business process is on.

Use it to:

  • CRM / quote-to-project integration: create the delivery project when a deal is won

Not for:

  • Creating a project without a template — no such REST v1 operation

Rules across fields:

  • R1: The legal entity (LegalEntityID, or the default one) must have a standard price group in CurrencyID.

Behaviour:

  • Not idempotent.
  • Not safe to retry blindly. Every call creates a new project; nothing deduplicates (not even ProjectNo was established as unique). After a lost response or a 403, look the project up before retrying.
  • Duplicates: Not deduplicated.
  • Side effect: Creates the project row, then the resource group and the project-manager (and milestone-assignee) resources, the invoice settings, the template status, and batch-creates tasks, milestones, contracts, allocations and payment plan from the template.
  • On failure: Not transactional: a failure after the project row is inserted leaves a partially created project.
  • Changes are visible to the next read immediately.

Call first: GET /v1/customer, GET /v1/user, GET /v1/currency/{status}, POST /v1/project/validate-create-from-template

Next: GET /v1/project/{projectID}, PUT /v1/project/{projectID}/status

Not yet documented: errors; examples.

curl -X POST "https://app3.timelog.com/your-account/api/v1/project/create-from-template" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
  "Name": "John Doe",
  "ProjectNo": "example_string",
  "CustomerID": 123,
  "Description": "example_string",
  "ProjectTemplateID": 123,
  "ProjectManagerID": 123,
  "ProjectStartDate": "2024-12-25T10:00:00Z",
  "ProjectEndDate": "2024-12-25T10:00:00Z",
  "ProjectTypeID": 123,
  "ProjectCategoryID": 123,
  "CurrencyID": 123,
  "LegalEntityID": 123,
  "DepartmentID": 123,
  "AccountManagerID": "null",
  "PartnerID": "null",
  "ContactID": 123,
  "InvoicingCustomerReferenceID": "null",
  "LanguageID": "null"
}'
{
  "Properties": {
    "ProjectID": 123,
    "ID": "123e4567-e89b-12d3-a456-426614174000",
    "Name": "John Doe",
    "No": "example_string",
    "ExpenseIsBillable": true,
    "CustomerID": 123,
    "Customer": {
      "CustomerID": 123,
      "ID": "123e4567-e89b-12d3-a456-426614174000",
      "Name": "John Doe",
      "No": "example_string",
      "DefaultMileageDistance": 25,
      "CustomerStatusID": 123,
      "VATNo": "example_string",
      "OrganizationNo": "example_string"
    },
    "ContactID": 123,
    "Description": "example_string",
    "DepartmentID": "null",
    "ProjectManagerID": "null",
    "AccountManagerID": "null",
    "PartnerID": "null",
    "ProjectTypeID": "null",
    "ProjectCategoryID": "null",
    "BudgetWorkHours": 3.14,
    "BudgetWorkAmount": 3.14,
    "StartDate": "null",
    "EndDate": "null"
  },
  "Links": [
    {
      "Href": "example_string",
      "Rel": "example_string"
    }
  ],
  "Actions": [
    {}
  ]
}
POST
/v1/project/create-from-template
POST
Base URLstring

Target server for requests. Edit to use your own host.

Bearer Token
Bearer Tokenstring
Required

OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp). The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user. > Not yet documented: how to obtain a token. > Not yet documented: token lifetime.

OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp). The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user. > Not yet documented: how to obtain a token. > Not yet documented: token lifetime.
Content-Typestring
Required

The media type of the request body

Options: application/json
Namestring
Required

Project name. > Not yet documented: constraints.

ProjectNostring

Project number. Empty or omitted = the template / auto-number value is kept. Default: the number the template mapping produces > Not yet documented: default.

CustomerIDinteger
Required

The customer the project is for. Refers to CustomerRead.CustomerID. Look up valid values with GET /v1/customer. Valid values come from GET /v1/customer.

Format: int32
Descriptionstring

Free-text project description.

ProjectTemplateIDinteger
Required

The project template to copy. Refers to ProjectTemplateRead.ProjectTemplateID.

Format: int32
ProjectManagerIDinteger
Required

The project manager, as a USER ID. Must be an existing, active user; stored as that user's employee. Refers to UserRead.UserID. Look up valid values with GET /v1/user. Valid values come from GET /v1/user.

Format: int32
ProjectStartDatestring
Required

Project start date. Time zone: not yet documented. > Not yet documented: constraints → timezone.

Format: date-time
ProjectEndDatestring
Required

Project end date (stored as the contract end date, returned as ProjectRead.EndDate). Time zone: not yet documented. > Not yet documented: constraints → timezone.

Format: date-time
ProjectTypeIDinteger
Required

Project type. Refers to ProjectTypeRead.ProjectTypeID.

Format: int32
ProjectCategoryIDinteger

Project category; 0 = none. Refers to ProjectCategoryRead.ProjectCategoryID.

Format: int32
CurrencyIDinteger
Required

Project currency. The legal entity must have a standard price group in this currency (else 30097). Refers to CurrencyRead.CurrencyID. Look up valid values with GET /v1/currency/{status}. Valid values come from GET /v1/currency/{status}.

Format: int32
LegalEntityIDinteger

Legal entity of the project; 0 = the account's default legal entity. Refers to LegalEntityRead.LegalEntityID. Look up valid values with GET /v1/legal-entity. Default: 0 → default legal entity - 0 or omitted — GetDefaultLegalEntity() Valid values come from GET /v1/legal-entity.

Format: int32
DepartmentIDinteger

Handling department; 0 = the default department. Refers to DepartmentRead.DepartmentID. Look up valid values with GET /v1/department. Default: 0 → default department Valid values come from GET /v1/department.

Format: int32
AccountManagerIDintegernull

Account manager, as a USER ID (existing, active). Only used when the AccountManager feature is on. Refers to UserRead.UserID. Look up valid values with GET /v1/user. - Feature AccountManager is off — Set to none, not validated. Valid values come from GET /v1/user.

Format: int32
PartnerIDintegernull

Partner, as a USER ID (existing, active); stored as that user's EMPLOYEE. Only used when the Partner feature is on. Refers to UserRead.UserID. Look up valid values with GET /v1/user. - Feature Partner is off — Set to none, not validated. Valid values come from GET /v1/user.

Format: int32
ContactIDinteger

Customer contact of the project; 0 = none. A contact the lookup does not return is ignored. Refers to ContactRead.ContactID. > Not yet documented: description.

Format: int32
InvoicingCustomerReferenceIDintegernull

Customer reference on invoices: -1 = the project's contact; > 0 = this contact ID; null/0 = none. Refers to ContactRead.ContactID. Applied by create-from-template only; validate-create-from-template does not map it. > Not yet documented: description.

Format: int32
LanguageIDintegernull

Invoice language. Only used when the InvoiceMultilingual feature is on; null = the customer's default invoice language. - Any other value — Validation (400), even when the feature is off. - Feature InvoiceMultilingual is off — ignored - null and feature on — Customer's default invoice language. Allowed values: | Value | Name | Meaning | |---|---|---| | 1 | Danish | Invoices in Danish. | | 2 | English | Invoices in English. | | 4 | Swedish | Invoices in Swedish. | | 15 | Norwegian | Invoices in Norwegian. | | 16 | German | Invoices in German. | | 17 | Dutch | Invoices in Dutch. | | 18 | French | Invoices in French. |

Format: int32 • Options: 1, 2, 4, 15, 16, 17, 18
Request Preview
Response

Response will appear here after sending the request

Authentication

header
Authorizationstring
Required

Bearer token. OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).

The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.

Not yet documented: how to obtain a token.

Not yet documented: token lifetime.

Body

application/json
Namestring
Required

Project name.

Not yet documented: constraints.

ProjectNostring

Project number. Empty or omitted = the template / auto-number value is kept.

Default: the number the template mapping produces

Not yet documented: default.

CustomerIDinteger
Required

The customer the project is for.

Refers to CustomerRead.CustomerID. Look up valid values with GET /v1/customer.

Valid values come from GET /v1/customer.

Descriptionstring

Free-text project description.

ProjectTemplateIDinteger
Required

The project template to copy.

Refers to ProjectTemplateRead.ProjectTemplateID.

ProjectManagerIDinteger
Required

The project manager, as a USER ID. Must be an existing, active user; stored as that user's employee.

Refers to UserRead.UserID. Look up valid values with GET /v1/user.

Valid values come from GET /v1/user.

ProjectStartDatestring
Required

Project start date.

Time zone: not yet documented.

Not yet documented: constraints → timezone.

ProjectEndDatestring
Required

Project end date (stored as the contract end date, returned as ProjectRead.EndDate).

Time zone: not yet documented.

Not yet documented: constraints → timezone.

ProjectTypeIDinteger
Required

Project type.

Refers to ProjectTypeRead.ProjectTypeID.

ProjectCategoryIDinteger

Project category; 0 = none.

Refers to ProjectCategoryRead.ProjectCategoryID.

CurrencyIDinteger
Required

Project currency. The legal entity must have a standard price group in this currency (else 30097).

Refers to CurrencyRead.CurrencyID. Look up valid values with GET /v1/currency/{status}.

Valid values come from GET /v1/currency/{status}.

LegalEntityIDinteger

Legal entity of the project; 0 = the account's default legal entity.

Refers to LegalEntityRead.LegalEntityID. Look up valid values with GET /v1/legal-entity.

Default: 0 → default legal entity

  • 0 or omitted — GetDefaultLegalEntity()

Valid values come from GET /v1/legal-entity.

DepartmentIDinteger

Handling department; 0 = the default department.

Refers to DepartmentRead.DepartmentID. Look up valid values with GET /v1/department.

Default: 0 → default department

Valid values come from GET /v1/department.

AccountManagerIDinteger,null

Account manager, as a USER ID (existing, active). Only used when the AccountManager feature is on.

Refers to UserRead.UserID. Look up valid values with GET /v1/user.

  • Feature AccountManager is off — Set to none, not validated.

Valid values come from GET /v1/user.

PartnerIDinteger,null

Partner, as a USER ID (existing, active); stored as that user's EMPLOYEE. Only used when the Partner feature is on.

Refers to UserRead.UserID. Look up valid values with GET /v1/user.

  • Feature Partner is off — Set to none, not validated.

Valid values come from GET /v1/user.

ContactIDinteger

Customer contact of the project; 0 = none. A contact the lookup does not return is ignored.

Refers to ContactRead.ContactID.

Not yet documented: description.

InvoicingCustomerReferenceIDinteger,null

Customer reference on invoices: -1 = the project's contact; > 0 = this contact ID; null/0 = none.

Refers to ContactRead.ContactID.

Applied by create-from-template only; validate-create-from-template does not map it.

Not yet documented: description.

LanguageIDinteger,null

Invoice language. Only used when the InvoiceMultilingual feature is on; null = the customer's default invoice language.

  • Any other value — Validation (400), even when the feature is off.

  • Feature InvoiceMultilingual is off — ignored

  • null and feature on — Customer's default invoice language.

Allowed values:

ValueNameMeaning
1DanishInvoices in Danish.
2EnglishInvoices in English.
4SwedishInvoices in Swedish.
15NorwegianInvoices in Norwegian.
16GermanInvoices in German.
17DutchInvoices in Dutch.
18FrenchInvoices in French.
Allowed values:12415161718

Responses

Propertiesobject

The REST v1 project: identifiers, name and number, customer and contact, the responsible people (project manager, account manager, partner), department, type and category, the work budget and the start/end dates. It does not carry status, contracts, tasks or financials. The TAF self link points to GET /v1/project/{ProjectID}; each entity also lists the four TAF actions create-from-template, validate-create-from-template, update-project and update-project-status.

Linksarray
Actionsobject[]