Re-raise the project-created events
Raises TimeLog's "project created" domain events again for an existing project, so integrations pick the project up.
Re-emits EventTypes.ProjectCreate for the project — the event the TimeLog project create normally raises — and, when the project is available in Resource Planner, IsAvailableInResourcePlannerChecked. Everything subscribed to those events reacts as if the project had just been created: the audit log (when project audit logging is on), notification subscribers, the financial integrations that transfer projects (e-conomic, Business Central, generic financial, Fortnox, Uniconta, Björn Lundén, and the integration-service mediator), and the Resource Planner export. Answers 200 with null. It checks only that the project exists: NO project privilege and no guard against raising the events more than once.
Not for:
- Integrators: this is an internal platform hook, not a 'resync project to ERP' operation — repeated calls replay the create to every subscriber
- Creating a project →
POST /v1/project/create-from-template
Behaviour:
- Not idempotent.
- Every call raises the events again; there is no record of a previous raise and no dedup.
- Not safe to retry blindly. Each retry replays the create to every subscriber (audit log, notifications, financial project transfer, Resource Planner export).
- Side effect: Logs a ProjectCreate event and, with the AuditLogProject setting, an audit-log entry 'project created' — again for an existing project.
- Side effect: Financial integrations: the integration-service mediator publishes a project-transfer notification for accounts whose integration supports and has activated project transfer, then sleeps 2 s in the request thread; the legacy integration services (e-conomic, Business Central, generic financial, Fortnox, Uniconta, Björn Lundén) handle ProjectCreate with the same SaveProject path as ProjectUpdate when UseTransferProject is set.
- Consistency: eventual
- Mediator publish and Resource Planner export are started in the request; how fast the external systems apply them is not measured.
Call first: GET /v1/project/{projectID}
See also: POST /v1/project/create-from-template
Not yet documented: behaviour → consistency; behaviour → duplicate handling; behaviour → side effects; examples; purpose → use cases.
curl -X POST "https://app3.timelog.com/your-account/api/v1/project/123/raise-created-events" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://app3.timelog.com/your-account/api/v1/project/123/raise-created-events"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.post(url, headers=headers)
print(response.json())
const response = await fetch("https://app3.timelog.com/your-account/api/v1/project/123/raise-created-events", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("POST", "https://app3.timelog.com/your-account/api/v1/project/123/raise-created-events", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://app3.timelog.com/your-account/api/v1/project/123/raise-created-events')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
"null"
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Not Found",
"message": "The requested resource was not found",
"code": 404
}
{
"error": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
/v1/project/{projectID}/raise-created-eventsTarget server for requests. Edit to use your own host.
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.
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.Route constraint :int.
Request Preview
Response
Response will appear here after sending the request
Authentication
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.
Path Parameters
Route constraint :int.
Responses
Success without content: HTTP 200 with the literal JSON body null. The literal null: the events were raised (handlers that run in the request have run).