{"openapi":"3.0.0","paths":{"/scim/v2/environments/{environmentId}/Users":{"post":{"operationId":"ScimUsersController_create","parameters":[],"responses":{"201":{"description":""}},"tags":["scim-users"]},"get":{"operationId":"ScimUsersController_list","parameters":[{"name":"filter","required":true,"in":"query","schema":{"type":"string"}},{"name":"startIndex","required":true,"in":"query","schema":{"type":"string"}},{"name":"count","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-users"]}},"/scim/v2/environments/{environmentId}/Users/{id}":{"get":{"operationId":"ScimUsersController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-users"]},"put":{"operationId":"ScimUsersController_replace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-users"]},"patch":{"operationId":"ScimUsersController_patch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-users"]},"delete":{"operationId":"ScimUsersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["scim-users"]}},"/scim/v2/environments/{environmentId}/Groups":{"post":{"operationId":"ScimGroupsController_create","parameters":[],"responses":{"201":{"description":""}},"tags":["scim-groups"]},"get":{"operationId":"ScimGroupsController_list","parameters":[{"name":"filter","required":true,"in":"query","schema":{"type":"string"}},{"name":"startIndex","required":true,"in":"query","schema":{"type":"string"}},{"name":"count","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-groups"]}},"/scim/v2/environments/{environmentId}/Groups/{id}":{"get":{"operationId":"ScimGroupsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-groups"]},"put":{"operationId":"ScimGroupsController_replace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-groups"]},"patch":{"operationId":"ScimGroupsController_patch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-groups"]},"delete":{"operationId":"ScimGroupsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"tags":["scim-groups"]}},"/scim/v2/environments/{environmentId}/ServiceProviderConfig":{"get":{"operationId":"ScimDiscoveryController_serviceProviderConfig","parameters":[],"responses":{"200":{"description":""}},"tags":["scim-discovery"]}},"/scim/v2/environments/{environmentId}/ResourceTypes":{"get":{"operationId":"ScimDiscoveryController_resourceTypes","parameters":[{"name":"environmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["scim-discovery"]}},"/scim/v2/environments/{environmentId}/Schemas":{"get":{"operationId":"ScimDiscoveryController_schemas","parameters":[],"responses":{"200":{"description":""}},"tags":["scim-discovery"]}}},"info":{"title":"Canopy SCIM 2.0","description":"Directory sync for IdP connectors. Requests and responses follow RFC 7643/7644 (`application/scim+json`, ListResponse, SCIM error envelope) rather than the Canopy envelope.","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"SCIM-Token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Per-Environment SCIM token (`scim_...`)"}},"schemas":{"ApiErrorBodyDto":{"type":"object","properties":{"statusCode":{"type":"number","example":401,"description":"HTTP status code."},"code":{"type":"string","nullable":true,"example":"auth.invalid_token","description":"Stable, machine-readable error code (a `MSG.*` constant). `null` for generic framework errors that carry no domain code."},"message":{"type":"string","example":"Invalid or expired token","description":"Human-readable English fallback message."},"timestamp":{"type":"string","example":"2026-04-20T12:00:00.000Z","description":"ISO-8601 timestamp of when the error was produced."},"path":{"type":"string","example":"/api/v1/api-keys","description":"Request path that produced the error."},"method":{"type":"string","example":"GET","description":"Request HTTP method."},"details":{"description":"Field-level validation messages, present only on 400 responses from request-body validation.","example":["name must be a string"],"type":"array","items":{"type":"string"}}},"required":["statusCode","code","message","timestamp","path","method"]},"ErrorResponseDto":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/ApiErrorBodyDto"}},"required":["error"]}}}}