{"ref":"artifact:sap-samples-spfi-reference-application","page":"/artifacts/sap-samples-spfi-reference-application","json":"/artifacts/sap-samples-spfi-reference-application.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"sap-samples-spfi-reference-application","name":"SPFI-Reference-Application","artifact_type":"sample","ecosystem":"btp","use_as":"reference","domain":"operations-and-runtime","origin_ring":"sap-official","description":{"one_line":"A Spring Boot reference application that demonstrates how to implement the SPFI V2 REST API contract for tenant lifecycle management between a provisioning operator and a service provider.","short":"Spring Boot reference implementing the SPFI V2 tenant lifecycle API","what_it_solves":"A SaaS provider whose tenants are to be managed by SAP's Unified Provisioning platform has to expose a specific contract, and this application demonstrates how to implement it: the standard interface between a Unified Provisioning operator and a service provider for tenant lifecycle management and SSO configuration. It covers the tenant endpoints for provisioning, updating, deleting and blocking or unblocking a tenant, secured with mutual TLS and made asynchronous through `202 Accepted` responses with `Retry-After` polling, plus optimistic concurrency on updates through `ETag` and `If-Match`, and a second activation call for the same `sapId` returns `409 Conflict` with the existing tenant's status URL. It covers the provider side only: the operator is SAP's Unified Provisioning platform and is not part of the repository.","when_not_to_use":"Not as the provider behind a live tenant estate: tenant state is kept in a file-based store for demonstration, and the README's own operations notes say a production implementation should use a reliable database so that state survives restarts."},"links":{"repo":"https://github.com/SAP-samples/SPFI-Reference-Application"},"identity":{"license":"Apache-2.0"},"source_available":true,"type_properties":{"form":{"value":"reference-application","sources":[{"url":"https://github.com/SAP-samples/SPFI-Reference-Application","title":"SAP-samples/SPFI-Reference-Application — README","checked":"2026-10-19","quote":"A Spring Boot reference application that demonstrates how to implement the **SPFI V2 REST API contract**"}]}},"interfaces":[{"kind":"api","protocol":"http","direction":"in","for":"the tenant endpoints the operator calls: activate, list, read, update and delete a tenant, poll an operation's status and trigger a lifecycle state change.","sources":[{"url":"https://github.com/SAP-samples/SPFI-Reference-Application","title":"SAP-samples/SPFI-Reference-Application — README, What is the SPFI V2 Contract?","checked":"2026-10-19","quote":"Version 2 defines the REST API that any service provider must expose so that the Unified Provisioning platform (the *operator*) can manage the full lifecycle of a tenant on that provider's system."},{"url":"https://github.com/SAP-samples/SPFI-Reference-Application","title":"SAP-samples/SPFI-Reference-Application — README, Architecture Overview","checked":"2026-10-19","quote":"OP -->|\"HTTPS + mTLS (cert from SAP PKI)\"| SPA"}]}],"demonstrates":["capability:multitenancy"],"maintainers":["actor:sap-samples"],"drafted_with_ai":true,"provenance":{"discovered_via":[{"source":"source:curator"}],"first_seen":"2026-09-14"},"contributors":["actor:ajinkyapatil8190","actor:gauravishuklasap","actor:manoharguptakancharla"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"good","evidence":"5 contributors, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Survived majors","tier":"unknown","evidence":"no BTP release lines in the atlas"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"fair","evidence":"none found in the tree"},{"label":"Docs","tier":"good","evidence":"README 20 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-25","npm":"not published under this name","stars":0,"forks":1,"open_issues":3,"archived":false,"pushed_at":"2026-10-19","license_spdx":"Apache-2.0","org_owned":true,"default_branch":"main","created_at":"2025-11-13T05:40:34Z","open_prs":1,"tree_truncated":false,"test_files":0,"workflows":0,"other_ci":false,"readme_bytes":20276,"docs_files":0,"changelog":false,"license_file":true,"dts_files":0,"first_commit":"2025-11-13","last_commit":"2026-10-16","commits":20,"contributors":5,"readme_path":"README.md","readme_sha":"8834fa07dfd8d3ea82783e407ea626348910dbe6","repo_read":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:sap-samples","name":"SAP Samples","json":"/actors/sap-samples.json"}],"contributors":[{"ref":"actor:ajinkyapatil8190","name":"Ajinkya Patil","json":"/actors/ajinkyapatil8190.json"},{"ref":"actor:gauravishuklasap","name":"Gauravi Shukla","json":"/actors/gauravishuklasap.json"},{"ref":"actor:manoharguptakancharla","name":"ManoharGuptaKancharla","json":"/actors/manoharguptakancharla.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}