MENU navbar-image
v2 v3 Coming soon

Introduction

Public API reference for the Intratime Company Apps V2 integration.

This documentation covers the Intratime Company Apps V2 API. All endpoints require Bearer token authentication. See the Migration Guide section if you are migrating from the legacy newapi.intratime.es integration.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_BEARER_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Contact your Intratime account manager to obtain an API token. No self-service token endpoint exists. See the Migration Guide section for full token onboarding instructions.

Clients

List all clients.

requires authentication

Returns all clients belonging to the authenticated company as a JSON array.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/client" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/client"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


[
    {
        "CLIENT_ID": 10,
        "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "CLIENT_NAME": "Beta Solutions Ltd.",
        "CLIENT_COUNTRY": "ES",
        "CLIENT_REGION": "Catalonia",
        "CLIENT_CITY": "Barcelona",
        "CLIENT_ADDRESS": "Passeig de Gracia 100",
        "CLIENT_CP": "08008",
        "CLIENT_COORDINATES": "41.396041,2.161047",
        "CID_OLD": null
    },
    {
        "CLIENT_ID": 11,
        "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "CLIENT_NAME": "Gamma Industries S.A.",
        "CLIENT_COUNTRY": "ES",
        "CLIENT_REGION": "Valencia",
        "CLIENT_CITY": "Valencia",
        "CLIENT_ADDRESS": "Avinguda del Regne de Valencia 25",
        "CLIENT_CP": "46005",
        "CLIENT_COORDINATES": "39.469903,-0.376288",
        "CID_OLD": null
    }
]
 

Request   

GET company-apps/api/v2/client

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a new client.

requires authentication

All address fields are required. Returns the created client on success.

Example request:
curl --request POST \
    "https://apicompanies.intratime.es/company-apps/api/v2/client" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Delta Corp\",
    \"country\": \"ES\",
    \"region\": \"Andalusia\",
    \"city\": \"Seville\",
    \"address\": \"Calle Sierpes 5\",
    \"cp\": \"41004\",
    \"coordinates\": \"37.388050,-5.982409\"
}"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/client"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Delta Corp",
    "country": "ES",
    "region": "Andalusia",
    "city": "Seville",
    "address": "Calle Sierpes 5",
    "cp": "41004",
    "coordinates": "37.388050,-5.982409"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "CLIENT_ID": 12,
    "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "CLIENT_NAME": "Delta Corp",
    "CLIENT_COUNTRY": "ES",
    "CLIENT_REGION": "Andalusia",
    "CLIENT_CITY": "Seville",
    "CLIENT_ADDRESS": "Calle Sierpes 5",
    "CLIENT_CP": "41004",
    "CLIENT_COORDINATES": "37.388050,-5.982409",
    "CID_OLD": null
}
 

Request   

POST company-apps/api/v2/client

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

The client's display name. Example: Delta Corp

country   string     

ISO 3166-1 alpha-2 country code. Example: ES

region   string     

Region or province. Example: Andalusia

city   string     

City name. Example: Seville

address   string     

Street address. Example: Calle Sierpes 5

cp   string     

Postal/ZIP code. Example: 41004

coordinates   string     

Latitude and longitude pair separated by a comma. Example: 37.388050,-5.982409

Get a single client.

requires authentication

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/client/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/client/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "CLIENT_ID": 10,
    "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "CLIENT_NAME": "Beta Solutions Ltd.",
    "CLIENT_COUNTRY": "ES",
    "CLIENT_REGION": "Catalonia",
    "CLIENT_CITY": "Barcelona",
    "CLIENT_ADDRESS": "Passeig de Gracia 100",
    "CLIENT_CP": "08008",
    "CLIENT_COORDINATES": "41.396041,2.161047",
    "CID_OLD": null,
    "company": null
}
 

Request   

GET company-apps/api/v2/client/{CLIENT_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

CLIENT_ID   integer     

Example: 16

client   integer     

The client's ID. Example: 10

Update a client.

requires authentication

All address fields are required. Returns the updated client on success.

Example request:
curl --request PUT \
    "https://apicompanies.intratime.es/company-apps/api/v2/client/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Beta Solutions Ltd. (Updated)\",
    \"country\": \"ES\",
    \"region\": \"Catalonia\",
    \"city\": \"Barcelona\",
    \"address\": \"Passeig de Gracia 200\",
    \"cp\": \"08008\",
    \"coordinates\": \"41.396041,2.161047\"
}"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/client/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Beta Solutions Ltd. (Updated)",
    "country": "ES",
    "region": "Catalonia",
    "city": "Barcelona",
    "address": "Passeig de Gracia 200",
    "cp": "08008",
    "coordinates": "41.396041,2.161047"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "CLIENT_ID": 10,
    "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "CLIENT_NAME": "Beta Solutions Ltd. (Updated)",
    "CLIENT_COUNTRY": "ES",
    "CLIENT_REGION": "Catalonia",
    "CLIENT_CITY": "Barcelona",
    "CLIENT_ADDRESS": "Passeig de Gracia 200",
    "CLIENT_CP": "08008",
    "CLIENT_COORDINATES": "41.396041,2.161047",
    "CID_OLD": null
}
 

Request   

PUT company-apps/api/v2/client/{CLIENT_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

CLIENT_ID   integer     

Example: 16

client   integer     

The client's ID. Example: 10

Body Parameters

name   string     

The client's display name. Example: Beta Solutions Ltd. (Updated)

country   string     

ISO 3166-1 alpha-2 country code. Example: ES

region   string     

Region or province. Example: Catalonia

city   string     

City name. Example: Barcelona

address   string     

Street address. Example: Passeig de Gracia 200

cp   string     

Postal/ZIP code. Example: 08008

coordinates   string     

Latitude and longitude pair separated by a comma. Example: 41.396041,2.161047

Delete a client.

requires authentication

Soft-deletes the client record. Returns an empty 204 response on success.

Example request:
curl --request DELETE \
    "https://apicompanies.intratime.es/company-apps/api/v2/client/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/client/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (204, Client deleted):

Empty response
 

Request   

DELETE company-apps/api/v2/client/{client_CLIENT_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

client_CLIENT_ID   integer     

Example: 16

client   integer     

The client's ID. Example: 10

Clocking Requests

List clocking requests for an employee.

requires authentication

Returns a {"clocking_requests": [...]} wrapper containing all time-correction requests for the specified employee within the given year (defaults to the current year when omitted).

The route-bound {employee} is company-fenced by model binding — a cross-tenant employee resolves to 404 before this action runs.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/user/16/clocking_requests?year=2024" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"year\": \"9775\"
}"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16/clocking_requests"
);

const params = {
    "year": "2024",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "year": "9775"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "clocking_requests": [
        {
            "CLOCKING_REQUESTS_ID": 55,
            "CLOCKING_REQUESTS_USER_ID": 101,
            "CLOCKING_REQUESTS_TYPE": 1,
            "CLOCKING_REQUESTS_STATUS": 0,
            "CLOCKING_REQUESTS_DT_START": "2024-03-10 09:00:00",
            "CLOCKING_REQUESTS_DT_END": "2024-03-10 10:00:00",
            "CLOCKING_REQUESTS_COMMENTS": "Forgot to clock in",
            "CLOCKING_REQUESTS_TARGET_CLOCKING_ID": null,
            "CLOCKING_REQUESTS_AMEND_PROJECT_ID": null,
            "CLOCKING_REQUESTS_COMPANY_ID": 42
        },
        {
            "CLOCKING_REQUESTS_ID": 56,
            "CLOCKING_REQUESTS_USER_ID": 101,
            "CLOCKING_REQUESTS_TYPE": 2,
            "CLOCKING_REQUESTS_STATUS": 1,
            "CLOCKING_REQUESTS_DT_START": "2024-03-12 14:00:00",
            "CLOCKING_REQUESTS_DT_END": "2024-03-12 14:30:00",
            "CLOCKING_REQUESTS_COMMENTS": "Time correction",
            "CLOCKING_REQUESTS_TARGET_CLOCKING_ID": 8840,
            "CLOCKING_REQUESTS_AMEND_PROJECT_ID": null,
            "CLOCKING_REQUESTS_COMPANY_ID": 42
        }
    ]
}
 

Request   

GET company-apps/api/v2/user/{employee_USER_ID}/clocking_requests

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

employee_USER_ID   integer     

Example: 16

employee   integer     

The employee's ID. Example: 101

Query Parameters

year   integer  optional    

optional 4-digit year filter for CLOCKING_REQUESTS_DT_START. Defaults to the current year. Example: 2024

Body Parameters

year   string  optional    

value debe tener 4 dígitos. Example: 9775

Clockings

Record a new clocking.

requires authentication

Creates a clocking event for the specified employee. The response is a flat INOUT_* object — NOT the legacy {"success":true,"clocking":{...}} wrapper. If the optional user_file image is included, send the request as multipart/form-data.

Example request:
curl --request POST \
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16/clocking" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "user_action=0"\
    --form "user_timestamp=2024-03-15 09:02:45"\
    --form "user_gps_coordinates=40.416775,-3.703790"\
    --form "user_project=7"\
    --form "user_expense=2"\
    --form "inout_device_uid=device-uuid-abc123"\
    --form "user_use_server_time="\
    --form "expense_amount=15.5"\
    --form "user_file=@/tmp/php2es2q1t6ta2tffCfg57" 
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16/clocking"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('user_action', '0');
body.append('user_timestamp', '2024-03-15 09:02:45');
body.append('user_gps_coordinates', '40.416775,-3.703790');
body.append('user_project', '7');
body.append('user_expense', '2');
body.append('inout_device_uid', 'device-uuid-abc123');
body.append('user_use_server_time', '');
body.append('expense_amount', '15.5');
body.append('user_file', document.querySelector('input[name="user_file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (201):


{
    "INOUT_ID": 8841,
    "INOUT_USER_ID": 101,
    "INOUT_TYPE": 0,
    "INOUT_DATE": "2024-03-15 09:02:47",
    "INOUT_END_DATE": null,
    "INOUT_PROJECT_ID": 7,
    "INOUT_COMMENTS": null,
    "INOUT_COORDINATES": "40.416775,-3.703790",
    "INOUT_SOURCE": 2,
    "INOUT_DEVICE_UID": "device-uuid-abc123",
    "INOUT_DEVICE_DATE": "2024-03-15 09:02:45",
    "INOUT_USE_SERVER_TIME": false,
    "INOUT_TELECOMMUTING": false
}
 

Request   

POST company-apps/api/v2/user/{employee_USER_ID}/clocking

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

employee_USER_ID   integer     

Example: 16

employee   integer     

The employee's ID. Example: 101

Body Parameters

user_action   integer     

Clocking type: 0 = Check-in, 1 = Check-out, 2 = Break start, 3 = Break end. Example: 0

user_timestamp   string     

Clocking datetime in Y-m-d H:i:s format (device local time unless user_use_server_time is true). Example: 2024-03-15 09:02:45

user_gps_coordinates   string  optional    

optional Latitude and longitude pair separated by a comma. Example: 40.416775,-3.703790

user_project   integer  optional    

optional The project ID to associate with this clocking (must belong to the authenticated company). Example: 7

user_file   file  optional    

optional Clocking image (JPEG, PNG or JPG). Multipart form upload only. Max size controlled by MAX_FILE_SIZE_CLOCKINGS env var (default 2 MB). Example: /tmp/php2es2q1t6ta2tffCfg57

user_expense   integer  optional    

optional The expense-type ID to associate with this clocking (must belong to the authenticated company). Example: 2

inout_device_uid   string  optional    

optional Unique identifier of the originating device. Example: device-uuid-abc123

user_use_server_time   boolean  optional    

optional When true, the server's current time is used instead of user_timestamp. Example: false

expense_amount   number  optional    

optional Monetary amount for the associated expense type. Example: 15.5

List clockings for an employee.

requires authentication

Returns a flat JSON array of clocking records for the specified employee. A hard server-side cap (LoginLogout::COMPANY_APPS_MAX_RESULTS) is always applied — maxResult may further restrict but cannot exceed the cap.

Clocking types map to: 0 = Check-in, 1 = Check-out, 2 = Break start, 3 = Break end.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/user/16/clockings?last=1&maxResult=50&from=2024-03-01+00%3A00%3A00&to=2024-03-31+23%3A59%3A59&type=0%2C1" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"last\": \"1\",
    \"maxResult\": 16,
    \"from\": \"2026-07-16 16:42:12\",
    \"to\": \"2052-08-08\",
    \"type\": \"1,3,1,2,2,3,2\"
}"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16/clockings"
);

const params = {
    "last": "1",
    "maxResult": "50",
    "from": "2024-03-01 00:00:00",
    "to": "2024-03-31 23:59:59",
    "type": "0,1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "last": "1",
    "maxResult": 16,
    "from": "2026-07-16 16:42:12",
    "to": "2052-08-08",
    "type": "1,3,1,2,2,3,2"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


[
    {
        "INOUT_ID": 8840,
        "INOUT_USER_ID": 101,
        "INOUT_TYPE": 0,
        "INOUT_DATE": "2024-03-14 08:58:10",
        "INOUT_END_DATE": null,
        "INOUT_PROJECT_ID": null,
        "INOUT_COMMENTS": null,
        "INOUT_COORDINATES": null,
        "INOUT_SOURCE": 2,
        "INOUT_DEVICE_UID": null,
        "INOUT_DEVICE_DATE": "2024-03-14 08:58:10",
        "INOUT_USE_SERVER_TIME": true,
        "INOUT_TELECOMMUTING": false
    },
    {
        "INOUT_ID": 8841,
        "INOUT_USER_ID": 101,
        "INOUT_TYPE": 1,
        "INOUT_DATE": "2024-03-14 17:03:22",
        "INOUT_END_DATE": null,
        "INOUT_PROJECT_ID": null,
        "INOUT_COMMENTS": null,
        "INOUT_COORDINATES": null,
        "INOUT_SOURCE": 2,
        "INOUT_DEVICE_UID": null,
        "INOUT_DEVICE_DATE": "2024-03-14 17:03:22",
        "INOUT_USE_SERVER_TIME": true,
        "INOUT_TELECOMMUTING": false
    }
]
 

Request   

GET company-apps/api/v2/user/{employee_USER_ID}/clockings

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

employee_USER_ID   integer     

Example: 16

employee   integer     

The employee's ID. Example: 101

Query Parameters

last   boolean  optional    

optional When true, results are ordered most-recent first; default is oldest first. Example: true

maxResult   integer  optional    

optional Maximum number of records to return (server cap always applies). Example: 50

from   string  optional    

optional Filter by start datetime (Y-m-d H:i:s). Example: 2024-03-01 00:00:00

to   string  optional    

optional Filter by end datetime (Y-m-d H:i:s); must be ≥ from. Example: 2024-03-31 23:59:59

type   string  optional    

optional Comma-separated clocking type filter. Allowed values: 0, 1, 2, 3. Example: 0,1

Body Parameters

last   string  optional    

Example: 1

Must be one of:
  • 0
  • 1
  • true
  • false
maxResult   integer  optional    

El value debe ser minimo 1. Example: 16

from   string  optional    

Must be a valid date in the format Y-m-d H:i:s. Example: 2026-07-16 16:42:12

to   string  optional    

Must be a valid date in the format Y-m-d H:i:s. Fecha inválida. Example: 2052-08-08

type   string  optional    

[0-3] mirrors Activity::CLOCKINGS [0,1,2,3] (the native clocking types). Input pre-validation only — the real type guard is $employee->clockings()'s whereIn('INOUT_TYPE', Activity::CLOCKINGS). Keep them in sync if CLOCKINGS changes. Must match the regex /^0-3*$/. Example: 1,3,1,2,2,3,2

Companies

Get the authenticated company's profile.

requires authentication

Returns the full company object including all employees with their associated projects, clients, and work centres.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/companies/current" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/companies/current"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "COMPANY_ID": 42,
    "COMPANY_UNIQUE_ID": "abc12345-1234-1234-1234-abc123456789",
    "COMPANY_NAME": "Acme Corp S.L.",
    "COMPANY_CIF": "B12345678",
    "COMPANY_CCC": "1234567890",
    "COMPANY_ADDRESS": "Calle Gran Via 1",
    "COMPANY_COUNTRY": "ES",
    "COMPANY_LOCATION": "Madrid",
    "COMPANY_CP": "28013",
    "COMPANY_COORDINATES": "40.416775,-3.703790",
    "COMPANY_MAIL": "admin@acme.example",
    "COMPANY_PASSWORD": "",
    "COMPANY_PRO": 1,
    "COMPANY_RATE": 2,
    "COMPANY_DELETION_DATE": null,
    "COMPANY_HAS_ADS": 0,
    "COMPANIES_TOKEN": "",
    "COMPANY_LOGO": "https://cdn.example.com/logos/acme.png",
    "COMPANY_SIGNATURE": null,
    "COMPANY_CONTINUOUS_WORKDAYS": 0,
    "COMPANY_USE_SERVER_TIME": 1,
    "COMPANY_FORCE_LOCATION": 0,
    "COMPANY_CALENDAR_DAYS": 0,
    "COMPANY_SHOW_CLIENT": 1,
    "COMPANY_SHOW_CLIENT_SELECT": 0,
    "COMPANY_EMAIL_UPDATES": 1,
    "COMPANY_API_COMMENTS": 0,
    "COMPANY_TIMEZONE": "Europe/Madrid",
    "users": [
        {
            "USER_ID": 101,
            "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
            "USER_NAME": "Jane Smith",
            "USER_EMAIL": "jane.smith@acme.example",
            "USER_TOKEN": "",
            "USER_IMAGE": null,
            "USER_NIF": null,
            "USER_AFFILIATION": null,
            "USER_WORKING_TIME": null,
            "USER_USERNAME": "jane.smith@acme.example",
            "USER_PASWORD": "",
            "projects": [],
            "workcenters": []
        }
    ]
}
 

Request   

GET company-apps/api/v2/companies/current

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Company login (deprecated — 410 Gone).

requires authentication

This endpoint has been retired. API access must now be granted formally by Intratime. Contact support to request a Bearer token.

Example request:
curl --request POST \
    "https://apicompanies.intratime.es/company-apps/api/v2/companies/login" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/companies/login"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (410):


{
    "error": {
        "code": "ENDPOINT_GONE",
        "message": "This login endpoint is no longer available. Access must now be requested formally.",
        "contact": "support@intratime.es"
    }
}
 

Request   

POST company-apps/api/v2/companies/login

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Employees

List all employees.

requires authentication

Returns all active employees of the authenticated company, each with their associated projects, clients, and work centres.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/user" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


[
    {
        "USER_ID": 101,
        "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "USER_NAME": "Jane Smith",
        "USER_EMAIL": "jane.smith@acme.example",
        "USER_TOKEN": "",
        "USER_IMAGE": null,
        "USER_NIF": null,
        "USER_AFFILIATION": null,
        "USER_WORKING_TIME": null,
        "USER_USERNAME": "jane.smith@acme.example",
        "USER_PASWORD": "",
        "projects": [
            {
                "PROJECT_ID": 7,
                "PROJECT_NAME": "Alpha Project",
                "PROJECT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
                "PID_OLD": null,
                "client": null,
                "users": []
            }
        ],
        "workcenters": [
            {
                "WORKCENTER_ID": 3,
                "WORKCENTER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
                "WORKCENTER_NAME": "Main Office",
                "WORKCENTER_COUNTRY": "ES",
                "WORKCENTER_REGION": "Madrid",
                "WORKCENTER_CITY": "Madrid",
                "WORKCENTER_ADDRESS": "Calle Gran Via 1",
                "WORKCENTER_CP": "28013",
                "WORKCENTER_COORDINATES": "40.416775,-3.703790",
                "WORKCENTER_CREATION_DATE": "2023-01-15 09:00:00",
                "WCID_OLD": null
            }
        ]
    },
    {
        "USER_ID": 102,
        "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "USER_NAME": "John Doe",
        "USER_EMAIL": "john.doe@acme.example",
        "USER_TOKEN": "",
        "USER_IMAGE": null,
        "USER_NIF": null,
        "USER_AFFILIATION": null,
        "USER_WORKING_TIME": null,
        "USER_USERNAME": "john.doe@acme.example",
        "USER_PASWORD": "",
        "projects": [],
        "workcenters": []
    }
]
 

Request   

GET company-apps/api/v2/user

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a new employee.

requires authentication

Creates an employee record under the authenticated company. Optionally accepts a profile picture via multipart form upload.

Example request:
curl --request POST \
    "https://apicompanies.intratime.es/company-apps/api/v2/user" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "user_email=alice@acme.example"\
    --form "user_pin=1234"\
    --form "user_name=Alice Doe"\
    --form "user_file=@/tmp/phpigqdkavo74lg7WcKFg9" 
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('user_email', 'alice@acme.example');
body.append('user_pin', '1234');
body.append('user_name', 'Alice Doe');
body.append('user_file', document.querySelector('input[name="user_file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (201):


{
    "USER_ID": 103,
    "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "USER_NAME": "Alice Doe",
    "USER_EMAIL": "alice.doe@acme.example",
    "USER_TOKEN": "",
    "USER_IMAGE": null,
    "USER_NIF": null,
    "USER_AFFILIATION": null,
    "USER_WORKING_TIME": null,
    "USER_USERNAME": "alice.doe@acme.example",
    "USER_PASWORD": "",
    "projects": [],
    "workcenters": []
}
 

Example response (422):


{
    "message": "Validation failed",
    "errors": {
        "user_email": [
            "The user email field is required.",
            "The user email has already been taken."
        ],
        "user_pin": [
            "The user pin field is required."
        ],
        "user_name": [
            "The user name field is required."
        ]
    }
}
 

Request   

POST company-apps/api/v2/user

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

user_email   string     

The employee's unique email address. Example: alice@acme.example

user_pin   string     

The employee's PIN code. Example: 1234

user_name   string     

The employee's full name. Example: Alice Doe

user_file   file  optional    

optional Profile picture (JPEG, PNG or JPG). Max size controlled by MAX_FILE_SIZE_AVATAR env var (default 2 MB). Multipart form upload only. Example: /tmp/phpigqdkavo74lg7WcKFg9

Employee login (deprecated — 410 Gone).

requires authentication

This endpoint has been retired. Use Bearer token authentication instead. Contact Intratime to obtain an API token.

Example request:
curl --request POST \
    "https://apicompanies.intratime.es/company-apps/api/v2/user/login" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/login"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (410):


{
    "error": {
        "code": "ENDPOINT_GONE",
        "message": "This login endpoint is no longer available. Access must now be requested formally.",
        "contact": "support@intratime.es"
    }
}
 

Request   

POST company-apps/api/v2/user/login

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get my profile (deprecated — 410 Gone).

requires authentication

This endpoint has been retired. Use GET /company-apps/api/v2/user/{employee} instead.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/user/my-profile" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/my-profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (410):


{
    "error": {
        "code": "ENDPOINT_GONE",
        "message": "The 'my-profile' endpoint has been retired. Please refer to the new alternative.",
        "alternative_01": "https://example.com/company-apps/api/v2/user/{employee_id}",
        "alternative_02": "https://old.example.com/api/user/{employee_id}",
        "documentation": "https://docs.example.com",
        "contact": "support@intratime.es"
    }
}
 

Request   

GET company-apps/api/v2/user/my-profile

POST company-apps/api/v2/user/my-profile

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get my projects (deprecated — 410 Gone).

requires authentication

This endpoint has been retired. Use GET /company-apps/api/v2/user/{employee} instead (the employee object includes their assigned projects).

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/user/my-project" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/my-project"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (410):


{
    "error": {
        "code": "ENDPOINT_GONE",
        "message": "The 'my-project' endpoint has been retired. Please refer to the new alternative.",
        "alternative_01": "https://example.com/company-apps/api/v2/user/{employee_id}",
        "alternative_02": "https://old.example.com/api/user/{employee_id}",
        "documentation": "https://docs.example.com",
        "contact": "support@intratime.es"
    }
}
 

Request   

GET company-apps/api/v2/user/my-project

POST company-apps/api/v2/user/my-project

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get a single employee.

requires authentication

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/user/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "USER_ID": 101,
    "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "USER_NAME": "Jane Smith",
    "USER_EMAIL": "jane.smith@acme.example",
    "USER_TOKEN": "",
    "USER_IMAGE": null,
    "USER_NIF": null,
    "USER_AFFILIATION": null,
    "USER_WORKING_TIME": null,
    "USER_USERNAME": "jane.smith@acme.example",
    "USER_PASWORD": "",
    "projects": [
        {
            "PROJECT_ID": 7,
            "PROJECT_NAME": "Alpha Project",
            "PROJECT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
            "PID_OLD": null,
            "client": null,
            "users": []
        }
    ],
    "workcenters": [
        {
            "WORKCENTER_ID": 3,
            "WORKCENTER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
            "WORKCENTER_NAME": "Main Office",
            "WORKCENTER_COUNTRY": "ES",
            "WORKCENTER_REGION": "Madrid",
            "WORKCENTER_CITY": "Madrid",
            "WORKCENTER_ADDRESS": "Calle Gran Via 1",
            "WORKCENTER_CP": "28013",
            "WORKCENTER_COORDINATES": "40.416775,-3.703790",
            "WORKCENTER_CREATION_DATE": "2023-01-15 09:00:00",
            "WCID_OLD": null
        }
    ]
}
 

Request   

GET company-apps/api/v2/user/{employee_USER_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

employee_USER_ID   integer     

Example: 16

employee   integer     

The employee's ID. Example: 101

Update an employee.

requires authentication

Updates an employee's profile. All fields are required except user_pin and user_file. Providing user_file replaces any existing profile picture.

Example request:
curl --request PUT \
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "user_email=alice@acme.example"\
    --form "user_pin=5678"\
    --form "user_name=Alice Smith"\
    --form "user_file=@/tmp/phpknoq511jqss3cIsFlqp" 
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('user_email', 'alice@acme.example');
body.append('user_pin', '5678');
body.append('user_name', 'Alice Smith');
body.append('user_file', document.querySelector('input[name="user_file"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "USER_ID": 101,
    "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "USER_NAME": "Jane Smith Updated",
    "USER_EMAIL": "jane.updated@acme.example",
    "USER_TOKEN": "",
    "USER_IMAGE": null,
    "USER_NIF": null,
    "USER_AFFILIATION": null,
    "USER_WORKING_TIME": null,
    "USER_USERNAME": "jane.updated@acme.example",
    "USER_PASWORD": "",
    "projects": [],
    "workcenters": []
}
 

Example response (422):


{
    "message": "Validation failed",
    "errors": {
        "user_email": [
            "The user email field is required.",
            "The user email has already been taken."
        ],
        "user_pin": [
            "The user pin field is required."
        ],
        "user_name": [
            "The user name field is required."
        ]
    }
}
 

Request   

PUT company-apps/api/v2/user/{employee_USER_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

employee_USER_ID   integer     

Example: 16

employee   integer     

The employee's ID. Example: 101

Body Parameters

user_email   string     

The employee's email address (must be unique, may be unchanged). Example: alice@acme.example

user_pin   string  optional    

optional New PIN code. Omit to keep the existing PIN. Example: 5678

user_name   string     

The employee's full name. Example: Alice Smith

user_file   file  optional    

optional New profile picture (JPEG, PNG or JPG). Max size controlled by MAX_FILE_SIZE_AVATAR env var (default 2 MB). Replaces the current picture. Multipart form upload only. Example: /tmp/phpknoq511jqss3cIsFlqp

Delete an employee.

requires authentication

Soft-deletes the employee record. Returns an empty 204 response on success.

Example request:
curl --request DELETE \
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/user/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (204, Employee deleted):

Empty response
 

Request   

DELETE company-apps/api/v2/user/{employee_USER_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

employee_USER_ID   integer     

Example: 16

employee   integer     

The employee's ID. Example: 101

Expenses

List expense types.

requires authentication

Returns the expense-type catalogue for the authenticated company as a flat JSON array. There are no filters — all active expense types are returned.

Each entry includes an EXPENSE_ICON URL (may be an empty string when no icon has been configured).

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/expenses" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/expenses"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


[
    {
        "EXPENSE_ID": 1,
        "EXPENSE_NAME": "Travel",
        "EXPENSE_ICON": "https://cdn.example.com/expenses/travel.png",
        "EXPENSE_CC": "TRV"
    },
    {
        "EXPENSE_ID": 2,
        "EXPENSE_NAME": "Meal",
        "EXPENSE_ICON": "https://cdn.example.com/expenses/meal.png",
        "EXPENSE_CC": "MLT"
    },
    {
        "EXPENSE_ID": 3,
        "EXPENSE_NAME": "Accommodation",
        "EXPENSE_ICON": "",
        "EXPENSE_CC": "ACC"
    }
]
 

Request   

GET company-apps/api/v2/expenses

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Projects

List all projects.

requires authentication

Returns all projects belonging to the authenticated company, each with their associated client and assigned employees.

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/project" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/project"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


[
    {
        "PROJECT_ID": 7,
        "PROJECT_NAME": "Alpha Project",
        "PROJECT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "PID_OLD": null,
        "client": {
            "CLIENT_ID": 10,
            "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
            "CLIENT_NAME": "Beta Solutions Ltd.",
            "CLIENT_COUNTRY": "ES",
            "CLIENT_REGION": "Catalonia",
            "CLIENT_CITY": "Barcelona",
            "CLIENT_ADDRESS": "Passeig de Gracia 100",
            "CLIENT_CP": "08008",
            "CLIENT_COORDINATES": "41.396041,2.161047",
            "CID_OLD": null
        },
        "users": [
            {
                "USER_ID": 101,
                "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
                "USER_NAME": "Jane Smith",
                "USER_EMAIL": "jane.smith@acme.example",
                "USER_TOKEN": "",
                "USER_IMAGE": null,
                "USER_NIF": null,
                "USER_AFFILIATION": null,
                "USER_WORKING_TIME": null,
                "USER_USERNAME": "jane.smith@acme.example",
                "USER_PASWORD": "",
                "projects": [],
                "workcenters": []
            }
        ]
    }
]
 

Request   

GET company-apps/api/v2/project

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a new project.

requires authentication

Creates a project under the authenticated company and optionally assigns employees. Returns the created project with its client and assigned users.

Example request:
curl --request POST \
    "https://apicompanies.intratime.es/company-apps/api/v2/project" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Beta Project\",
    \"client\": 11,
    \"user_ids\": \"101,102\"
}"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/project"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Beta Project",
    "client": 11,
    "user_ids": "101,102"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "PROJECT_ID": 8,
    "PROJECT_NAME": "Beta Project",
    "PROJECT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "PID_OLD": null,
    "client": {
        "CLIENT_ID": 11,
        "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "CLIENT_NAME": "Gamma Industries S.A.",
        "CLIENT_COUNTRY": "ES",
        "CLIENT_REGION": "Valencia",
        "CLIENT_CITY": "Valencia",
        "CLIENT_ADDRESS": "Avinguda del Regne de Valencia 25",
        "CLIENT_CP": "46005",
        "CLIENT_COORDINATES": "39.469903,-0.376288",
        "CID_OLD": null
    },
    "users": []
}
 

Request   

POST company-apps/api/v2/project

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

The project's name. Example: Beta Project

client   integer     

The client ID to associate with the project (must belong to the authenticated company). Example: 11

user_ids   string  optional    

optional Comma-separated list of employee IDs to assign to the project (each must belong to the authenticated company). Example: 101,102

Get a single project.

requires authentication

Example request:
curl --request GET \
    --get "https://apicompanies.intratime.es/company-apps/api/v2/project/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/project/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "PROJECT_ID": 7,
    "PROJECT_NAME": "Alpha Project",
    "PROJECT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "PID_OLD": null,
    "client": {
        "CLIENT_ID": 10,
        "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "CLIENT_NAME": "Beta Solutions Ltd.",
        "CLIENT_COUNTRY": "ES",
        "CLIENT_REGION": "Catalonia",
        "CLIENT_CITY": "Barcelona",
        "CLIENT_ADDRESS": "Passeig de Gracia 100",
        "CLIENT_CP": "08008",
        "CLIENT_COORDINATES": "41.396041,2.161047",
        "CID_OLD": null
    },
    "users": [
        {
            "USER_ID": 101,
            "USER_COMPANY": "abc12345-1234-1234-1234-abc123456789",
            "USER_NAME": "Jane Smith",
            "USER_EMAIL": "jane.smith@acme.example",
            "USER_TOKEN": "",
            "USER_IMAGE": null,
            "USER_NIF": null,
            "USER_AFFILIATION": null,
            "USER_WORKING_TIME": null,
            "USER_USERNAME": "jane.smith@acme.example",
            "USER_PASWORD": "",
            "projects": [],
            "workcenters": []
        }
    ]
}
 

Request   

GET company-apps/api/v2/project/{PROJECT_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

PROJECT_ID   integer     

Example: 16

project   integer     

The project's ID. Example: 7

Update a project.

requires authentication

Updates the project name, client association, and employee assignments. Providing user_ids replaces the existing employee list entirely.

Example request:
curl --request PUT \
    "https://apicompanies.intratime.es/company-apps/api/v2/project/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Alpha Project Updated\",
    \"client\": 10,
    \"user_ids\": \"101\"
}"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/project/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Alpha Project Updated",
    "client": 10,
    "user_ids": "101"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "PROJECT_ID": 7,
    "PROJECT_NAME": "Alpha Project Updated",
    "PROJECT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
    "PID_OLD": null,
    "client": {
        "CLIENT_ID": 10,
        "CLIENT_COMPANY": "abc12345-1234-1234-1234-abc123456789",
        "CLIENT_NAME": "Beta Solutions Ltd.",
        "CLIENT_COUNTRY": "ES",
        "CLIENT_REGION": "Catalonia",
        "CLIENT_CITY": "Barcelona",
        "CLIENT_ADDRESS": "Passeig de Gracia 100",
        "CLIENT_CP": "08008",
        "CLIENT_COORDINATES": "41.396041,2.161047",
        "CID_OLD": null
    },
    "users": []
}
 

Request   

PUT company-apps/api/v2/project/{PROJECT_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

PROJECT_ID   integer     

Example: 16

project   integer     

The project's ID. Example: 7

Body Parameters

name   string     

The project's name. Example: Alpha Project Updated

client   integer     

The client ID to associate with the project (must belong to the authenticated company). Example: 10

user_ids   string  optional    

optional Comma-separated list of employee IDs. Replaces all existing assignments. Example: 101

Delete a project.

requires authentication

Soft-deletes the project record. Returns an empty 204 response on success.

Example request:
curl --request DELETE \
    "https://apicompanies.intratime.es/company-apps/api/v2/project/16" \
    --header "Authorization: Bearer {YOUR_BEARER_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://apicompanies.intratime.es/company-apps/api/v2/project/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_BEARER_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (204, Project deleted):

Empty response
 

Request   

DELETE company-apps/api/v2/project/{project_PROJECT_ID}

Headers

Authorization        

Example: Bearer {YOUR_BEARER_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_PROJECT_ID   integer     

Example: 16

project   integer     

The project's ID. Example: 7

Migration Guide

This section is for integrators migrating from the legacy newapi.intratime.es API. If you are starting a new integration, start with the Authentication section.


TL;DR

Your old URL still resolves via the load balancer, but you MUST change the auth header and several endpoints changed behavior:


Authentication Change

Legacy header (no longer accepted):

token: your_token_value

Required header:

Authorization: Bearer your_sanctum_token

Cross-origin Authorization drop on redirects: If your client follows HTTP redirects, the Authorization header may be silently dropped by some HTTP clients (RFC 9110 §15.4). Call the canonical V2 host directly instead of relying on load-balancer URL rewriting.

For token issuance, see the Token Onboarding section below.


Deprecated Empty Fields

The following fields are always empty strings ("") in all V2 API responses. They are retained for backward compatibility but carry no value. Do not use them for authentication or session management.

Field Status
USER_TOKEN Deprecated — always ""
COMPANIES_TOKEN Deprecated — always ""
COMPANY_PASSWORD Deprecated — always ""

Behavior Changes

Clocking Store — Flat Response Shape

The POST /user/{employee}/clocking endpoint response shape changed:

Legacy shape (no longer returned):

{
  "success": true,
  "clocking": {
    "INOUT_ID": 12345,
    "INOUT_TYPE": "in"
  }
}

*V2 shape (flat INOUT_ object):**

{
  "INOUT_ID": 12345,
  "INOUT_TYPE": "in",
  "INOUT_SUBTYPE": null
}

PUT /user/{employee} — Returns 200

PUT /user/{employee} returns 200 OK on success. The legacy endpoint returned 201 Created.

No _method=PUT Spoofing

The V2 API does not support HTML form _method overrides. Send the correct HTTP verb (PUT, DELETE) directly.


410 Tombstones — Discontinued Endpoints

The following endpoints are permanently discontinued and return 410 ENDPOINT_GONE:

POST companies/login

Authentication via a dedicated company login endpoint is discontinued. API access requires a Sanctum Bearer token issued by Intratime.

Migration: Contact your Intratime account manager to obtain a Bearer token. See Token Onboarding.

POST user/login

Authentication via a dedicated user login endpoint is discontinued.

Migration: Use an Authorization: Bearer token issued by Intratime.

GET user/my-profile

Migration: Use GET /company-apps/api/v2/user/{employee} with the employee ID from your token payload.

GET user/my-project (legacy: /api/my-project)

Migration: Use GET /company-apps/api/v2/project to list all projects accessible to your token.


URL Transparency Table

The load balancer transparently rewrites legacy URLs to their V2 equivalents for most endpoints. The table below lists all known mappings grouped by change type.

Note: URL rewriting is transparent, but the auth header change is required on all non-gone endpoints. Endpoints marked behavior-changed also require additional client-side changes.

redirected / auth-changed (URL only — Bearer auth header required)

Legacy Method Legacy Path Canonical Path
GET /api/user/ company-apps/api/v2/user
POST /api/user company-apps/api/v2/user
GET /api/user/{id} company-apps/api/v2/user/{employee}
DELETE /api/user/{id} company-apps/api/v2/user/{employee}
GET /api/client/ company-apps/api/v2/client
POST /api/client company-apps/api/v2/client
GET /api/client/{id} company-apps/api/v2/client/{client}
DELETE /api/client/{id} company-apps/api/v2/client/{client}
GET /api/project/ company-apps/api/v2/project
POST /api/project company-apps/api/v2/project
GET /api/project/{id} company-apps/api/v2/project/{project}
DELETE /api/project/{id} company-apps/api/v2/project/{project}
GET /api/expenses company-apps/api/v2/expenses

behavior-changed (URL + auth + additional client changes required)

Legacy Canonical Change
POST /api/user/{id} PUT company-apps/api/v2/user/{employee} Verb changed: use PUT
POST /api/client/{id} PUT company-apps/api/v2/client/{client} Verb changed: use PUT
POST /api/project/{id} PUT company-apps/api/v2/project/{project} Verb changed: use PUT
POST /api/user/clocking POST company-apps/api/v2/user/{employee}/clocking Explicit {employee} required; response shape changed (flat INOUT_*)
GET /api/user/clockings GET company-apps/api/v2/user/{employee}/clockings Explicit {employee} required
GET /api/user/clocking_requests GET company-apps/api/v2/user/{employee}/clocking_requests Explicit {employee} required

gone (410 — endpoint permanently discontinued)

Legacy Reason
POST /api/companies/login Authentication endpoint removed; use Bearer token
POST /api/user/login Authentication endpoint removed; use Bearer token
GET /api/user/my-profile Use GET /company-apps/api/v2/user/{employee}
GET /api/my-project Use GET /company-apps/api/v2/project

Token Onboarding

No self-service token endpoint exists.

Token issuance for API access requires a manual process:

  1. The company owner contacts their Intratime account manager.
  2. Intratime provisions a Sanctum Bearer token scoped to the company.
  3. The token is delivered out-of-band (contact channel TBD with Intratime).

Once you have the token, include it in every API request:

Authorization: Bearer <your_token>