{"openapi":"3.1.0","info":{"title":"Speed API","description":"Standalone, read-only API over **Speed CRS** (`app.speedautosystems.com`).\n\n**Data source** — every endpoint can be served from the **live proxy** (authenticated\ncall to Speed) or the **local DB clone**. Switch the active source from the UI at `/`,\nvia `PUT /api/admin/data-source`, or per-request with `?source=live|db`.\n\n**Auth** — send your key as `X-API-Key: <key>` or `Authorization: Bearer <key>`.","version":"1.0.0"},"servers":[{"url":"https://speedapi.youscogroup.com","description":"Production"},{"url":"/","description":"This server"}],"paths":{"/health":{"get":{"tags":["meta"],"summary":"Health check","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/speed/vehicles":{"get":{"tags":["speed"],"summary":"List fleet vehicles","operationId":"get_vehicles_api_speed_vehicles_get","parameters":[{"name":"plate_no","in":"query","required":false,"schema":{"type":"string","description":"Filter by plate number","default":"","title":"Plate No"},"description":"Filter by plate number"},{"name":"status_id","in":"query","required":false,"schema":{"type":"string","description":"Filter by status id","default":"","title":"Status Id"},"description":"Filter by status id"},{"name":"vehicle_type","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vehicle Type"}},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Location Id"}},{"name":"all_active","in":"query","required":false,"schema":{"type":"boolean","description":"Return all active vehicles","default":true,"title":"All Active"},"description":"Return all active vehicles"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/vehicles/summary":{"get":{"tags":["speed"],"summary":"Fleet status summary","operationId":"get_vehicles_summary_api_speed_vehicles_summary_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/agreements":{"get":{"tags":["speed"],"summary":"List rental agreements","operationId":"get_agreements_api_speed_agreements_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","description":"Period year (with month) for a date-ranged query","default":0,"title":"Year"},"description":"Period year (with month) for a date-ranged query"},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"plate_no","in":"query","required":false,"schema":{"type":"string","description":"Filter by plate number","default":"","title":"Plate No"},"description":"Filter by plate number"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/agreements/summary":{"get":{"tags":["speed"],"summary":"Agreements dashboard summary","operationId":"get_agreements_summary_api_speed_agreements_summary_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/agreements/search":{"get":{"tags":["speed"],"summary":"Search agreements by plate or number","operationId":"search_agreements_api_speed_agreements_search_get","parameters":[{"name":"plate","in":"query","required":false,"schema":{"type":"string","description":"Plate number","default":"","title":"Plate"},"description":"Plate number"},{"name":"agreement_no","in":"query","required":false,"schema":{"type":"string","description":"Agreement number","default":"","title":"Agreement No"},"description":"Agreement number"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/bookings":{"get":{"tags":["speed"],"summary":"List bookings","operationId":"get_bookings_api_speed_bookings_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/bookings/summary":{"get":{"tags":["speed"],"summary":"Bookings summary","operationId":"get_bookings_summary_api_speed_bookings_summary_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/customers/search":{"get":{"tags":["speed"],"summary":"Search customers","operationId":"search_customers_api_speed_customers_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search text (name/email/mobile)","title":"Q"},"description":"Search text (name/email/mobile)"},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/customers/{customer_id}":{"get":{"tags":["speed"],"summary":"Get a customer by id","operationId":"get_customer_api_speed_customers__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","title":"Customer Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/movements":{"get":{"tags":["speed"],"summary":"List vehicle movements","operationId":"get_movements_api_speed_movements_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"plate_no","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plate No"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/nrms":{"get":{"tags":["speed"],"summary":"List NRM (non-revenue movements)","operationId":"get_nrms_api_speed_nrms_get","parameters":[{"name":"plate_no","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plate No"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/workshop-movements":{"get":{"tags":["speed"],"summary":"List workshop movements","operationId":"get_workshop_movements_api_speed_workshop_movements_get","parameters":[{"name":"plate_no","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plate No"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/custody-movements":{"get":{"tags":["speed"],"summary":"List custody movements","operationId":"get_custody_movements_api_speed_custody_movements_get","parameters":[{"name":"plate_no","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plate No"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/assets":{"get":{"tags":["speed"],"summary":"List assets","operationId":"get_assets_api_speed_assets_get","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/assets/{asset_id}":{"get":{"tags":["speed"],"summary":"Get an asset by id","operationId":"get_asset_api_speed_assets__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/invoices":{"get":{"tags":["speed"],"summary":"List invoices for a period","operationId":"get_invoices_api_speed_invoices_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/credit-notes":{"get":{"tags":["speed"],"summary":"List credit notes for a period","operationId":"get_credit_notes_api_speed_credit_notes_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/debit-notes":{"get":{"tags":["speed"],"summary":"List debit notes for a period","operationId":"get_debit_notes_api_speed_debit_notes_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Max"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/deposits":{"get":{"tags":["speed"],"summary":"List deposits","operationId":"get_deposits_api_speed_deposits_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/used-deposits":{"get":{"tags":["speed"],"summary":"Used deposit report","operationId":"get_used_deposits_api_speed_used_deposits_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/loan-details":{"get":{"tags":["speed"],"summary":"Loan details for a period","operationId":"get_loan_details_api_speed_loan_details_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/sale-report":{"get":{"tags":["speed"],"summary":"Vehicle revenue sale report","operationId":"get_sale_report_api_speed_sale_report_get","parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source for this request: 'live' or 'db'.","title":"Source"},"description":"Override data source for this request: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/reference":{"get":{"tags":["reference"],"summary":"List available reference types","operationId":"list_reference_types_api_speed_reference_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response List Reference Types Api Speed Reference Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/speed/reference/{ref_type}":{"get":{"tags":["reference"],"summary":"Fetch a reference/lookup list","operationId":"get_reference_api_speed_reference__ref_type__get","parameters":[{"name":"ref_type","in":"path","required":true,"schema":{"type":"string","title":"Ref Type"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override data source: 'live' or 'db'.","title":"Source"},"description":"Override data source: 'live' or 'db'."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/data-source":{"get":{"tags":["admin"],"summary":"Get the active data source","operationId":"get_data_source_api_admin_data_source_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSourceState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Switch the active data source","operationId":"set_data_source_api_admin_data_source_put","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"examples":[{"source":"db"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSourceState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sync":{"post":{"tags":["admin"],"summary":"Clone data from live into the DB","operationId":"run_sync_api_admin_sync_post","parameters":[{"name":"cache_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Clone a single type; omit to clone the default set","title":"Cache Type"},"description":"Clone a single type; omit to clone the default set"},{"name":"year","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":0,"default":0,"title":"Month"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sync/status":{"get":{"tags":["admin"],"summary":"Recent clone runs + snapshot inventory","operationId":"sync_status_api_admin_sync_status_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clone-targets":{"get":{"tags":["admin"],"summary":"Catalog types (and the default clone set)","operationId":"clone_targets_api_admin_clone_targets_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"DataSourceState":{"properties":{"source":{"type":"string","title":"Source","description":"Active data source: 'live' or 'db'."},"default":{"type":"string","title":"Default"},"db_available":{"type":"boolean","title":"Db Available"}},"type":"object","required":["source","default","db_available"],"title":"DataSourceState"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SpeedResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"source":{"type":"string","title":"Source","description":"Which backend served this response: 'live' or 'db'."},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At","description":"When the data was fetched from Speed (ISO 8601)."},"result":{"title":"Result","description":"Raw Speed ABP result payload."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Advisory message, if any."}},"type":"object","required":["source"],"title":"SpeedResponse","description":"Uniform envelope returned by every read endpoint, identical for live and DB."},"SyncResult":{"properties":{"requested":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requested"},"succeeded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Succeeded"},"failed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failed"},"period":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Period"},"results":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Results"},"cache_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cache Type"},"ok":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ok"},"item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Count"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","title":"SyncResult"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"tags":[{"name":"speed","description":"Read-only Speed CRS data (vehicles, agreements, bookings, movements, invoices, …)."},{"name":"reference","description":"Reference / lookup lists (currencies, countries, locations, tariff groups, …)."},{"name":"admin","description":"Data-source toggle and DB clone control. Powers the UI switch."},{"name":"meta","description":"Health and spec."}],"security":[{"ApiKeyHeader":[]}]}