> For the complete documentation index, see [llms.txt](https://docs.skhokho.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skhokho.ai/assets/services.md).

# ⚙️ Services

Service catalog and offerings management

## List services

> Get a paginated list of services with optional filters

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Services","description":"Service catalog and offerings management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ServiceList":{"type":"object","description":"Lightweight serializer for service lists.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"date_created":{"type":"string","format":"date-time","nullable":true}},"required":["effective_rate","name","short_description"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/services/":{"get":{"operationId":"organisation_services_list","description":"Get a paginated list of services with optional filters","summary":"List services","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true}],"tags":["Services"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ServiceList"}}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}}}}
```

## Create service

> Create a new service. service\_type is required and must be one of: hourly, fixed, subscription, project, consultation, maintenance, or other.

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Services","description":"Service catalog and offerings management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ServiceRequest":{"type":"object","description":"Full serializer for Service creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"Service type: hourly, fixed, subscription, project, consultation, maintenance, or other\n\n* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true}},"required":["name","service_type"]},"ServiceDetail":{"type":"object","description":"Detailed serializer for single service retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ServicePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","effective_rate","name","short_description"]},"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/services/create/":{"post":{"operationId":"organisation_services_create_create","description":"Create a new service. service_type is required and must be one of: hourly, fixed, subscription, project, consultation, maintenance, or other.","summary":"Create service","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true}],"tags":["Services"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ServiceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ServiceRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDetail"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"}}}}}}
```

## Retrieve service

> Get detailed information about a specific service

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Services","description":"Service catalog and offerings management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ServiceDetail":{"type":"object","description":"Detailed serializer for single service retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ServicePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","effective_rate","name","short_description"]},"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/services/{unique_id}/":{"get":{"operationId":"organisation_services_retrieve","description":"Get detailed information about a specific service","summary":"Retrieve service","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Services"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDetail"}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Update service

> Update service information (PUT for full update, PATCH for partial)

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Services","description":"Service catalog and offerings management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ServiceRequest":{"type":"object","description":"Full serializer for Service creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"Service type: hourly, fixed, subscription, project, consultation, maintenance, or other\n\n* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true}},"required":["name","service_type"]},"ServiceDetail":{"type":"object","description":"Detailed serializer for single service retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ServicePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","effective_rate","name","short_description"]},"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/services/{unique_id}/update/":{"put":{"operationId":"organisation_services_update_update","description":"Update service information (PUT for full update, PATCH for partial)","summary":"Update service","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Services"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ServiceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ServiceRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDetail"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Update service

> Update service information (PUT for full update, PATCH for partial)

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Services","description":"Service catalog and offerings management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"PatchedServiceRequest":{"type":"object","description":"Full serializer for Service creation and updates.\nHandles translatable fields correctly.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","nullable":true},"short_description":{"type":"string","nullable":true,"maxLength":500},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"Service type: hourly, fixed, subscription, project, consultation, maintenance, or other\n\n* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true}}},"ServiceDetail":{"type":"object","description":"Detailed serializer for single service retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ServicePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","effective_rate","name","short_description"]},"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/services/{unique_id}/update/":{"patch":{"operationId":"organisation_services_update_partial_update","description":"Update service information (PUT for full update, PATCH for partial)","summary":"Update service","parameters":[{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Services"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedServiceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedServiceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedServiceRequest"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDetail"}}},"description":""},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```

## Perform action on service

> Perform actions on a service (duplicate, deactivate). Uses query parameters.

```json
{"openapi":"3.0.3","info":{"title":"Skhokho API","version":"v1.0"},"tags":[{"name":"Services","description":"Service catalog and offerings management"}],"servers":[{"url":"https://skhokho.ai","description":"Production"},{"url":"http://102.209.118.152:8000/","description":"Local"},{"url":"https://dev.skhokho.ai","description":"Development"}],"security":[{"cookieAuth":[]},{"basicAuth":[]}],"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"basicAuth":{"type":"http","scheme":"basic"}},"schemas":{"ServiceDetail":{"type":"object","description":"Detailed serializer for single service retrieval.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"short_description":{"type":"string","readOnly":true},"service_code":{"type":"string","nullable":true,"maxLength":100},"service_type":{"enum":["hourly","fixed","subscription","project","consultation","maintenance","other"],"type":"string","description":"* `hourly` - Hourly Service\n* `fixed` - Fixed Price Service\n* `subscription` - Subscription Service\n* `project` - Project-based Service\n* `consultation` - Consultation Service\n* `maintenance` - Maintenance Service\n* `other` - Other"},"category":{"type":"string","nullable":true,"maxLength":200},"hourly_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Rate per hour for hourly services"},"fixed_price":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Fixed price for the service"},"effective_rate":{"type":"string","format":"decimal","pattern":"^-?\\d{0,8}(?:\\.\\d{0,2})?$","nullable":true,"readOnly":true},"billing_cycle":{"enum":["one_time","hourly","daily","weekly","monthly","quarterly","annually"],"type":"string","description":"* `one_time` - One Time\n* `hourly` - Hourly\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly\n* `quarterly` - Quarterly\n* `annually` - Annually"},"estimated_duration_hours":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,2})?$","nullable":true,"title":"Estimated Duration (Hours)","description":"Estimated time to complete the service"},"status":{"enum":["active","inactive","discontinued"],"type":"string","description":"* `active` - Active\n* `inactive` - Inactive\n* `discontinued` - Discontinued"},"requirements":{"type":"string","nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/ServicePersonMini"}],"readOnly":true},"date_created":{"type":"string","format":"date-time","nullable":true},"last_updated":{"type":"string","format":"date-time","nullable":true}},"required":["created_by","description","effective_rate","name","short_description"]},"ServicePersonMini":{"type":"object","description":"Lightweight serializer for Person references.","properties":{"unique_id":{"type":"string","nullable":true,"maxLength":100},"full_name":{"type":"string","nullable":true,"readOnly":true}},"required":["full_name"]}}},"paths":{"/api/v1.0/organisation/{org_uid}/services/{unique_id}/action/":{"get":{"operationId":"organisation_services_action_retrieve","description":"Perform actions on a service (duplicate, deactivate). Uses query parameters.","summary":"Perform action on service","parameters":[{"in":"query","name":"action","schema":{"type":"string","enum":["deactivate","duplicate"]},"description":"Action to perform: duplicate or deactivate","required":true},{"in":"path","name":"org_uid","schema":{"type":"string"},"required":true},{"in":"path","name":"unique_id","schema":{"type":"string"},"required":true}],"tags":["Services"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDetail"}}},"description":""},"400":{"description":"Bad Request - Invalid action"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}}}
```
