Download OpenAPI specification:
Publicly available API endpoints to Proteus
| type | string Enum: "supplier" "client" "subcontractor" "3rd_party" "agency" "internal" List companies matching a single type. |
| include | string Default: "basic" Enum: "all" "basic" Choose between including all parameters or only the basic ones in the request. All parameters includes staff_rep, contacts and offices. |
| page | integer The page number to retrieve items from the result set. |
| per_page | integer The numbers of items to return |
{- "data": [
- {
- "id": 1,
- "company_name": "ACME",
- "email": "acme@example.com",
- "website": "www.example.com",
- "status": "active",
- "reference": "CO-HO-00001",
- "company_key": "ACM",
- "metadata": { },
- "company_type": "client"
}
], - "meta": {
- "total_items": 1,
- "total_pages": 1,
- "current_page": 1,
- "per_page": "20"
}
}| id required | integer Company ID |
| include | string Default: "basic" Enum: "all" "basic" Choose between including all parameters or only the basic ones in the request. All parameters includes staff_rep, contacts and offices. |
{- "data": {
- "id": 1,
- "company_name": "ACME",
- "email": "acme@example.com",
- "website": "www.example.com",
- "status": "active",
- "reference": "CO-HO-00001",
- "company_key": "ACM",
- "metadata": { },
- "company_type": "client"
}
}| id required | integer Company ID |
{- "data": [
- {
- "description": "Main Office",
- "address1": "1 office addresss",
- "address2": "2 office address",
- "city": "Aberdeen",
- "postcode": "AB10 1XE",
- "state": "United Kingdom",
- "country": "United Kingdom",
- "country_code": "GB",
- "created_at": "2023-07-05T08:23:00Z",
- "updated_at": "2023-08-31T08:00:00Z"
}, - {
- "description": "Secondary Office",
- "address1": "1 Office Address",
- "address2": "2 Office Address",
- "city": "Edinburgh",
- "postcode": "EH8 8DX",
- "state": "United Kingdom",
- "country": "United Kingdom",
- "country_code": "GB",
- "created_at": "2023-08-31T08:01:00Z",
- "updated_at": "2023-08-31T08:01:00Z"
}
]
}| id required | integer Company ID |
{- "data": [
- {
- "name": "Main Office",
- "job_title": "1 office addresss",
- "email": "2 office address",
- "telephone": "Aberdeen",
- "postcode": "AB10 1XE",
- "mobile": "United Kingdom"
}, - {
- "name": "Main Office",
- "job_title": "1 office addresss",
- "email": "2 office address",
- "telephone": "Aberdeen",
- "postcode": "AB10 1XE",
- "mobile": "United Kingdom"
}
]
}| id required | integer Company ID |
Request body for the metadata
| metadata_key | string Metadata key and value |
{- "metadata_key": "{value}"
}{- "data": {
- "success": "Company ID {id} Metadata Updated"
}
}Request body for expenses
Array of objects | |
| name | string |
| company_id required | integer |
| job_title | string |
| email required | string <email> |
| telephone | string |
| mobile | string |
{- "metadata": [
- {
- "key": "Key",
- "value": "Value"
}
], - "name": "James Smith",
- "company_id": 1,
- "job_title": "Software Engineer",
- "email": "james.smith@example.com",
- "telephone": "1234567890",
- "mobile": "0987654321"
}{- "data": {
- "success": "Contact ID: {ID}"
}
}| include | string Default: "basic" Enum: "all" "basic" Choose between including all parameters or only the basic ones in the request. All parameters includes staff_rep, contacts and offices. |
| active | boolean Filter the list based on the active status. Set this parameter to |
| page | integer The page number to retrieve items from the result set. |
| per_page | integer The numbers of items to return |
| date_won_from | string Example: date_won_from=2023-01-01 Filter proposals to those that have been won, starting from this date |
| date_won_to | string Example: date_won_to=2023-01-01 Filter proposals to those that have been won, before this date. |
{- "data": [
- {
- "id": 1,
- "title": "Project Propsal",
- "reference": "J-PROP-00001",
- "description": "Full resource proposal",
- "deadline": "2024-08-21",
- "date_sent_won": "2023-08-24",
- "go_probability": 50,
- "get_probability": 80,
- "root_work_package": 1,
- "estimated_value": 10000,
- "total_planned_value": 10000,
- "planned_margin": 11,
- "date_won": "2023-08-24",
- "billing_type": {
- "slug": "fixed_price",
- "name": "Fixed Price"
}, - "bid_type": {
- "slug": "single-source",
- "name": "Single Source"
}, - "contract_type": {
- "slug": "call_off",
- "name": "Call off"
}, - "state": {
- "name": "Won",
- "variant": "green",
- "slug": "won",
- "is_internal": false
}, - "metadata": {
- "custom_fields": [
- {
- "key": "custom_key",
- "value": "custom_Value"
}
], - "billing_type_group": "fixed_price"
}, - "created_at": "2023-08-24 12:00"
}
], - "meta": {
- "total_items": 1,
- "total_pages": 1,
- "current_page": 1,
- "per_page": "20"
}
}| id required | integer Proposal ID |
| include | string Default: "basic" Enum: "all" "basic" Choose between including all parameters or only the basic ones in the request. All parameters includes budget, office, manager, company, company_contact and contract. |
{- "data": {
- "id": 1,
- "title": "Project Propsal",
- "reference": "J-PROP-00001",
- "description": "Full resource proposal",
- "deadline": "2024-08-21",
- "date_sent_won": "2023-08-24",
- "go_probability": 50,
- "get_probability": 80,
- "root_work_package": 1,
- "estimated_value": 10000,
- "total_planned_value": 10000,
- "planned_margin": 11,
- "date_won": "2023-08-24",
- "billing_type": {
- "slug": "fixed_price",
- "name": "Fixed Price"
}, - "bid_type": {
- "slug": "single-source",
- "name": "Single Source"
}, - "contract_type": {
- "slug": "call_off",
- "name": "Call off"
}, - "state": {
- "name": "Won",
- "variant": "green",
- "slug": "won",
- "is_internal": false
}, - "metadata": {
- "custom_fields": [
- {
- "key": "custom_key",
- "value": "custom_Value"
}
], - "billing_type_group": "fixed_price"
}, - "created_at": "2023-08-24 12:00"
}
}| include | string Default: "basic" Enum: "all" "basic" Choose between including all parameters or only the basic ones in the request. All parameters includes staff_rep, contacts and offices. |
| active | boolean Filter the list based on the active status. Set this parameter to |
| page | integer The page number to retrieve items from the result set. |
| per_page | integer The numbers of items to return |
{- "data": [
- {
- "id": 1,
- "title": "Website Project",
- "reference": "J-HO-00001",
- "description": "Full resource project",
- "deadline": "2024-08-21 00:00:00",
- "metadata": {
- "custom_fields": "",
- "billing_type_group": ""
}, - "manager": {
- "id": 22,
- "name": "James Smith",
- "email": "james.smith@example.com",
- "metadata": ""
}, - "milestones": [
- {
- "id": 4,
- "name": "milestone 1",
- "amount": "500"
}, - {
- "id": 5,
- "name": "milestone 2",
- "amount": "1500"
}
], - "root_work_package": 912,
- "billing_type": {
- "slug": "fixed_price",
- "name": "Fixed Price"
}, - "bid_type": {
- "slug": "single-source",
- "name": "Single Source"
}, - "contract_type": {
- "slug": "call_off",
- "name": "Call off"
}, - "status": {
- "id": 13,
- "name": "active",
- "variant": "green",
- "slug": "project_work_started"
}, - "created_at": "2023-08-24T11:58:57Z"
}
], - "meta": {
- "total_items": 1,
- "total_pages": 1,
- "current_page": 1,
- "per_page": "20"
}
}required | integer or string Project ID / Reference |
| usingReference | boolean Optional Flag to find project by reference (0 = false, 1 = true) |
{- "data": {
- "id": 1,
- "title": "Website Project",
- "reference": "J-HO-00001",
- "description": "Full resource project",
- "deadline": "2024-08-21 00:00:00",
- "metadata": {
- "custom_fields": "",
- "billing_type_group": ""
}, - "manager": {
- "id": 22,
- "name": "James Smith",
- "email": "james.smith@example.com",
- "metadata": ""
}, - "milestones": [
- {
- "id": 4,
- "name": "milestone 1",
- "amount": "500"
}, - {
- "id": 5,
- "name": "milestone 2",
- "amount": "1500"
}
], - "root_work_package": 912,
- "billing_type": {
- "slug": "fixed_price",
- "name": "Fixed Price"
}, - "bid_type": {
- "slug": "single-source",
- "name": "Single Source"
}, - "contract_type": {
- "slug": "call_off",
- "name": "Call off"
}, - "status": {
- "id": 13,
- "name": "active",
- "variant": "green",
- "slug": "project_work_started"
}, - "created_at": "2023-08-24T11:58:57Z"
}
}required | integer or string Project ID / Reference |
{- "data": {
- "id": 1,
- "title": "Website Project",
- "reference": "J-HO-00001",
- "description": "Full resource project",
- "deadline": "2024-08-21 00:00:00",
- "metadata": {
- "custom_fields": ""
}, - "outgoing_purchase_orders": [
- {
- "id": 1,
- "reference": "OPO-000002",
- "status": "Draft",
- "notes": "Outgoing purchase order notes",
- "address": "11 Main Street",
- "total": 10000,
- "subtotal": 9900,
- "tax_total": 100
}, - {
- "id": 2,
- "reference": "OPO-000003",
- "status": "Draft",
- "notes": "Outgoing purchase order notes",
- "address": "11 Main Street",
- "total": 10000,
- "subtotal": 9900,
- "tax_total": 100
}
]
}
}| id required | integer Outgoing Purchase Order Receipt ID |
{- "data": {
- "id": 2,
- "invoice_number": "30DASDA",
- "subtotal": 39000,
- "supplier_reference": "CO-HO-00002",
- "currency": "GBP",
- "project_reference": "J-HO-00002",
- "created_at": "2023-12-06T00:00:00Z",
- "outgoing_purchase_order": {
- "id": 1,
- "reference": "OPO-000002",
- "status": "Draft",
- "notes": "Outgoing purchase order notes",
- "address": "11 Main Street",
- "total": 10000,
- "subtotal": 9900,
- "tax_total": 100
}
}
}| id required | integer Work Package ID |
| max_depth | integer [ 1 .. 20 ] Default: 10 The maximum depth of the tree to retrieve. |
{- "data": {
- "id": 0,
- "parent_id": 0,
- "reference": "string",
- "revision_reference": "string",
- "name": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "depth": 0,
- "progress": 0,
- "planned_labour_hours": 0,
- "budget": {
- "value": 0
}, - "roll_up_budget": 0,
- "metadata": {
- "internal_only": true
}, - "type": "string",
- "allowed_children": true,
- "has_manual_dates": true,
- "children": [
- { }
]
}
}| status | string Enum: "draft" "in-review" "in-review" "internally-approved" "rejected" "issued" "approved" Status of the variations to retrieve. |
| root_work_package | integer Limit the variations only to a single root work package id. |
| page | integer The page number to retrieve items from the result set. |
| per_page | integer The numbers of items to return |
{- "data": [
- {
- "id": 1,
- "name": "Variation One",
- "reference": "V-00001",
- "status": {
- "id": 74,
- "name": "Client Approved",
- "slug": "approved"
}, - "created_at": "2023-08-24T12:09:44Z",
- "type": "variation",
- "creator": {
- "id": 22,
- "name": "James Smith",
- "email": "james.smith@example.com"
}, - "budget": {
- "value": 200,
- "currency": "GBP"
}, - "revised_work_packages": [
- 100,
- 112,
- 120
], - "variation_amounts": {
- "hours": 10,
- "resources": 200,
- "cost": 0,
- "expenses": 0,
- "hardware": 0,
- "software": 0,
- "markup": 0,
- "total": 200
}, - "editable": false,
- "can_roll_back": false,
- "metadata": { }
}
], - "meta": {
- "total_items": 1,
- "total_pages": 1,
- "current_page": 1,
- "per_page": "20"
}
}{- "data": {
- "id": 1,
- "name": "Variation One",
- "reference": "V-00001",
- "status": {
- "id": 74,
- "name": "Client Approved",
- "slug": "approved"
}, - "created_at": "2023-08-24T12:09:44Z",
- "type": "variation",
- "creator": {
- "id": 22,
- "name": "James Smith",
- "email": "james.smith@example.com"
}, - "budget": {
- "value": 200,
- "currency": "GBP"
}, - "revised_work_packages": [
- 100,
- 112,
- 120
], - "variation_amounts": {
- "hours": 10,
- "resources": 200,
- "cost": 0,
- "expenses": 0,
- "hardware": 0,
- "software": 0,
- "markup": 0,
- "total": 200
}, - "editable": false,
- "can_roll_back": false,
- "metadata": { }
}
}This API endpoint allows you to create or update a staff user based on their external reference. If the user with the provided external reference exists, the endpoint will update their information; otherwise, it will create a new user.
Request body for staff
| reference required | string A unique reference string for the user. E.g. Application Staff ID |
| external_reference required | string A secondary reference to match with your application. Proteus will match using the |
| first_name required | string First name |
| last_name required | string Last name |
| email required | string Email address (should be unique) |
required | object Match with either id or name |
required | object Match with either id or name |
required | object Match with either id or name |
required | object Match with either id or name |
| job_title | string Job title |
| contact_no | string Contact number |
| location | string Location/city |
| employment_type | string Default: "staff-fulltime" Enum: "staff-fulltime" "staff-parttime" "contract" "freelance" Employment type |
| user_role | string Default: "offline" Enum: "offline" "company-admin" "company-manager" "office-manager" "manager" "user" "timesheet-only-user" User sccess role |
| cost | number Default: 0 Cost per hour |
| expected_weekly_hours | number Default: 40 Expected hours per week. |
object Match with either id or external_reference | |
object | |
| active | boolean Default: true Make a staff profile active or inactive (only for offline user) |
object |
{- "reference": "5_DIGIT",
- "external_reference": "External-GUID",
- "first_name": "John",
- "last_name": "Doe",
- "email": "john.doe@xergy.com",
- "job_title": "Senior Engineer",
- "contact_no": "12345678",
- "location": "Aberdeenshire",
- "employment_type": "staff-fulltime",
- "user_role": "manager",
- "cost": 250,
- "expected_weekly_hours": 40,
- "department": {
- "name": "Engineering"
}, - "grade": {
- "name": "Senior"
}, - "discipline": {
- "name": "Drilling Engineer"
}, - "office": {
- "name": "Aberdeen"
}, - "manager": {
- "external_reference": "Manager-External-GUID"
}, - "profile": {
- "qualification": "BEng",
- "affiliations": "Cisco Certified",
- "experience": 10,
- "profile_summary": "Profile",
- "experience_summary": "Experience",
- "is_chartered_engineer": true,
- "nationality": "United Kingdom"
}, - "custom_fields": {
- "region": "EMEA",
- "total_yearly_basic_cost": 30000,
- "contracting_entity": "Government",
- "start_date": "2023-01-01",
- "termination_date": "2024-01-01"
}, - "active": true
}{- "data": {
- "message": "Staff created successfully",
- "id": 40
}
}| date_from required | string <date> Example: date_from=2023-01-12 Date in Y-m-d |
| date_to required | string <date> Example: date_to=2023-01-19 Date in Y-m-d |
| approved | boolean Example: approved=true Boolean flag to only include approved timesheets |
| discipline | string Example: discipline=Developer Filter user timesheets by discipline |
| timesheet_id | integer Example: timesheet_id=55 Get a single timesheet by id |
{- "data": {
- "billable": [
- {
- "project_reference": "Reference 1",
- "id": 508,
- "type": "project",
- "work_package_id": 310,
- "work_package_title": "2.1.1",
- "timesheets": [
- {
- "timesheet_id": 55,
- "user_id": 1,
- "email": "james.smith@example.com",
- "status": "approved",
- "name": "James Smith",
- "date": "2023-05-31",
- "minutes_logged": 15,
- "rate": "45",
- "metadata": {
- "key": "value"
}
}, - {
- "timesheet_id": 56,
- "user_id": 2,
- "email": "john.doe@example.com",
- "status": "approved",
- "name": "John Doe",
- "date": "2023-05-31",
- "minutes_logged": 30,
- "rate": "30",
- "metadata": {
- "key": "value"
}
}
]
}, - {
- "project_reference": "Reference 2",
- "work_package_id": 311,
- "work_package_title": "2.1.2",
- "timesheets": [
- {
- "timesheet_id": 57,
- "user_id": 1,
- "email": "james.smith@example.com",
- "status": "approved",
- "name": "James Smith",
- "date": "2023-05-31",
- "minutes_logged": 15,
- "rate": "45",
- "metadata": {
- "key": "value"
}
}, - {
- "timesheet_id": 58,
- "user_id": 2,
- "email": "john.doe@example.com",
- "status": "approved",
- "name": "John Doe",
- "date": "2023-05-31",
- "minutes_logged": 30,
- "rate": "30",
- "metadata": null
}
]
}
], - "non_billable": [
- {
- "label": "medical leave",
- "timesheets": [
- {
- "timesheet_id": 60,
- "user_id": 10,
- "email": "jane.doe@example.com",
- "status": "approved",
- "name": "Jane Doe",
- "date": "2023-06-15",
- "minutes_logged": 120,
- "rate": "0",
- "metadata": {
- "key": "value"
}
}
]
}
]
}
}Request body for timesheet
Array of objects (TimesheetEntry) |
{- "data": [
- {
- "date": "2024-02-27",
- "timesheet_type": "staff",
- "user_id": "string",
- "user_external_reference": {
- "external_reference": "string"
}, - "timesheet_external_reference": {
- "external_reference": "string"
}, - "logged_minutes": 0,
- "project_id": 0,
- "work_package_id": 0,
- "status": "submitted",
- "non_billable_code": "string"
}
]
}{- "data": "Timesheets created/updated"
}Request body for expenses
| user_email required | string Email address of the user attached to the expense |
| expense_type required | string Value: "labour" Expense Type |
| project_reference | string Project reference required if billable is true |
| work_package_reference | string Workpackage reference |
| dated required | string The date of the expense in YYYY-MM-DD format |
| billable required | boolean A boolean flag if the expense is billable |
| comment required | string A comment attached to the expense |
| rate required | integer The expense rate |
| quantity required | string quantity of the expense |
| type required | string Enum: "Direct" "Paid by me" Finance Type |
| notes required | string Expense notes |
| status required | string Enum: "approved" "draft" "reopen" "pending" Expense status |
{- "user_email": "james.smith@example.com",
- "expense_type": "labour",
- "project_reference": "J-HO-00001",
- "work_package_reference": "100",
- "dated": "2023-03-15",
- "billable": true,
- "comment": "This is a comment",
- "rate": 35,
- "quantity": 4,
- "type": "Direct",
- "notes": "Example notes",
- "status": "approved"
}{- "data": {
- "success": "Expense Created ID: {ID}"
}
}{- "data": {
- "date": "2023-08-29",
- "company_exact_id": "exact-id-company",
- "reference": "I-HO-00001",
- "project_reference": "demo-reference-30",
- "currency": "GBP",
- "subtotal_value": "33.75",
- "tax_percentage": "10",
- "notes": "Example notes",
- "line_items": {
- "timesheet": [
- {
- "line_item_id": 1,
- "subtotal": "33.75",
- "total_tax": "3.38",
- "total_invoiced": "37.13"
}, - {
- "line_item_id": 2,
- "subtotal": "40.55",
- "total_tax": "4.05",
- "total_invoiced": "44.60"
}
]
}
}
}