{"id":45792303,"url":"https://github.com/python-scim/scim2-client","last_synced_at":"2026-02-26T12:09:52.417Z","repository":{"id":241400973,"uuid":"806735126","full_name":"python-scim/scim2-client","owner":"python-scim","description":"Pythonically build SCIM requests and parse SCIM responses","archived":false,"fork":false,"pushed_at":"2026-02-05T13:58:30.000Z","size":1383,"stargazers_count":18,"open_issues_count":6,"forks_count":5,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-02-06T00:45:34.314Z","etag":null,"topics":["httpx","httpx-client","provisioning","rfc7643","rfc7644","scim","scim2"],"latest_commit_sha":null,"homepage":"https://scim2-client.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/python-scim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["yaal-coop"]}},"created_at":"2024-05-27T19:41:03.000Z","updated_at":"2026-02-05T13:58:33.000Z","dependencies_parsed_at":"2024-06-27T21:42:50.498Z","dependency_job_id":"b4b7a76f-9d3a-4e45-a791-0ebaaa0df8b8","html_url":"https://github.com/python-scim/scim2-client","commit_stats":null,"previous_names":["yaal-coop/httpx-scim-client","python-scim/scim2-client","yaal-coop/scim2-client"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/python-scim/scim2-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/python-scim%2Fscim2-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/python-scim%2Fscim2-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/python-scim%2Fscim2-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/python-scim%2Fscim2-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/python-scim","download_url":"https://codeload.github.com/python-scim/scim2-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/python-scim%2Fscim2-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29858490,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T08:51:08.701Z","status":"ssl_error","status_checked_at":"2026-02-26T08:50:19.607Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["httpx","httpx-client","provisioning","rfc7643","rfc7644","scim","scim2"],"created_at":"2026-02-26T12:09:49.765Z","updated_at":"2026-02-26T12:09:52.406Z","avatar_url":"https://github.com/python-scim.png","language":"Python","readme":"# scim2-client\n\nA SCIM client Python library built upon [scim2-models](https://scim2-models.readthedocs.io) ,\nthat pythonically build requests and parse responses,\nfollowing the [RFC7643](https://datatracker.ietf.org/doc/html/rfc7643.html) and [RFC7644](https://datatracker.ietf.org/doc/html/rfc7644.html) specifications.\nYou can use whatever request engine you prefer to perform network requests, but scim2-client comes with [httpx](https://github.com/encode/httpx) support.\n\nIt aims to be used in SCIM client applications, or in unit tests for SCIM server applications.\n\n## What's SCIM anyway?\n\nSCIM stands for System for Cross-domain Identity Management, and it is a provisioning protocol.\nProvisioning is the action of managing a set of resources across different services, usually users and groups.\nSCIM is often used between Identity Providers and applications in completion of standards like OAuth2 and OpenID Connect.\nIt allows users and groups creations, modifications and deletions to be synchronized between applications.\n\n## Features\n\n- **CRUD Operations**: `create`, `query`, `replace`, `delete` methods for SCIM resources\n- **PATCH Support**: Partial resource modifications with `add`, `remove` and `replace` operations\n- **Server Discovery**: Automatic retrieval of `ServiceProviderConfig`, `ResourceTypes` and `Schemas`\n- **Search \u0026 Filtering**: Support for SCIM filters, sorting, pagination and attribute selection\n- **Sync \u0026 Async**: Both synchronous and asynchronous clients available\n- **Multiple HTTP Engines**: Built-in support for [httpx](https://github.com/encode/httpx) (sync/async) and [werkzeug](https://werkzeug.palletsprojects.com/) (testing). Adaptable to any network engine.\n- **Request \u0026 Response Validation**: Automatic payload validation against SCIM schemas\n- **Error Handling**: Structured exceptions for network, request and response errors\n\n## Installation\n\n```shell\npip install scim2-client[httpx]\n```\n\n## Usage\n\nCheck the [tutorial](https://scim2-client.readthedocs.io/en/latest/tutorial.html)\nand the [reference](https://scim2-client.readthedocs.io/en/latest/reference.html) for more details.\n\nHere is an example of usage:\n\n```python\nimport datetime\nfrom httpx import Client\nfrom scim2_client import SCIMResponseErrorObject\nfrom scim2_client.engines.httpx import SyncSCIMClient\n\nclient = Client(base_url=\"https://auth.example/scim/v2\", headers={\"Authorization\": \"Bearer foobar\"})\nscim = SyncSCIMClient(client)\nscim.discover()\nUser = scim.get_resource_model(\"User\")\n\n# Query resources\nuser = scim.query(User, \"2819c223-7f76-453a-919d-413861904646\")\nassert user.user_name == \"bjensen@example.com\"\nassert user.meta.last_modified == datetime.datetime(\n    2024, 4, 13, 12, 0, 0, tzinfo=datetime.timezone.utc\n)\n\n# Update resources\nuser.display_name = \"Babs Jensen\"\nuser = scim.replace(user)\nassert user.display_name == \"Babs Jensen\"\nassert user.meta.last_modified == datetime.datetime(\n    2024, 4, 13, 12, 0, 30, tzinfo=datetime.timezone.utc\n)\n\n# Create resources\nuser = User(user_name=\"bjensen@example.com\")\ntry:\n    scim.create(user)\nexcept SCIMResponseErrorObject as exc:\n    error = exc.to_error()\n    assert error.detail == \"One or more of the attribute values are already in use or are reserved.\"\n```\n\nscim2-client belongs in a collection of SCIM tools developed by [Yaal Coop](https://yaal.coop),\nwith [scim2-models](https://github.com/python-scim/scim2-models),\n[scim2-tester](https://github.com/python-scim/scim2-tester) and\n[scim2-cli](https://github.com/python-scim/scim2-cli)\n","funding_links":["https://github.com/sponsors/yaal-coop"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpython-scim%2Fscim2-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpython-scim%2Fscim2-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpython-scim%2Fscim2-client/lists"}