Repository: TBD54566975/ssi-service
Pull request #490 (2023-05-25 23:40:52)

Factor out manifest requests
# Overview
This provides a similar mechanism to the presentation requests pattern. 

# Description
I moved shared logic to a common folder. Open to name suggestions. 

# How Has This Been Tested?
Added unit tests, and modified existing ones where it made sense. 



codecov-commenter: ## [Codecov](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) Report
> Merging [#490](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) (5b1322c) into [main](https://app.codecov.io/gh/TBD54566975/ssi-service/commit/8e6c480756065b8bbb690017deff5968e16a6dfd?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) (8e6c480) will **decrease** coverage by `0.20%`.
> The diff coverage is `5.71%`.

```diff
@@            Coverage Diff             @@
##             main     #490      +/-   ##
==========================================
- Coverage   20.81%   20.62%   -0.20%     
==========================================
  Files          48       48              
  Lines        5673     5756      +83     
==========================================
+ Hits         1181     1187       +6     
- Misses       4283     4360      +77     
  Partials      209      209              
```


| [Impacted Files](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) | Coverage Δ | |
|---|---|---|
| [config/config.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-Y29uZmlnL2NvbmZpZy5nbw==) | `15.48% <ø> (ø)` | |
| [pkg/server/router/manifest.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZlci9yb3V0ZXIvbWFuaWZlc3QuZ28=) | `7.67% <0.00%> (-2.52%)` | :arrow_down: |
| [pkg/server/router/presentation.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZlci9yb3V0ZXIvcHJlc2VudGF0aW9uLmdv) | `2.74% <0.00%> (+0.09%)` | :arrow_up: |
| [pkg/server/server.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/490?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZlci9zZXJ2ZXIuZ28=) | `68.20% <100.00%> (+0.90%)` | :arrow_up: |



Patch:
diff --git a/config/config.go b/config/config.go
index 9a5d794..90bd8a9 100644
--- a/config/config.go
+++ b/config/config.go
@@ -166,6 +166,7 @@ func (c *CredentialServiceConfig) IsEmpty() bool {
 
 type ManifestServiceConfig struct {
 	*BaseServiceConfig
+	ExpirationDuration time.Duration `toml:"expiration_duration" conf:"default:30m"`
 }
 
 func (m *ManifestServiceConfig) IsEmpty() bool {
diff --git a/doc/docs.go b/doc/docs.go
index 506f4ef..4edd61f 100644
--- a/doc/docs.go
+++ b/doc/docs.go
@@ -5,7 +5,7 @@ package doc
 import "github.com/swaggo/swag/v2"
 
 const docTemplate = `{
-    "schemes": {{ marshal .Schemes }},"swagger":"2.0","info":{"description":"{{escape .Description}}","title":"{{.Title}}","contact":{"name":"TBD","url":"https://github.com/TBD54566975/ssi-service/issues","email":"tbd-developer@squareup.com"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"{{.Version}}"},"host":"{{.Host}}","basePath":"{{.BasePath}}","paths":{"/health":{"get":{"description":"Health is a simple handler that always responds with a 200 OK","consumes":["application/json"],"produces":["application/json"],"tags":["HealthCheck"],"summary":"Health Check","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetHealthCheckResponse"}}}}},"/readiness":{"get":{"description":"Readiness runs a number of application specific checks to see if all the relied upon services are\nhealthy.","consumes":["application/json"],"produces":["application/json"],"tags":["Readiness"],"summary":"Readiness","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetReadinessResponse"}}}}},"/v1/credentials":{"get":{"description":"Checks for the presence of a query parameter and calls the associated filtered get method. Only one parameter is allowed to be specified.","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"List Credentials","parameters":[{"type":"string","example":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp","description":"The issuer id","name":"issuer","in":"query"},{"type":"string","description":"The credentialSchema.id value to filter by","name":"schema","in":"query"},{"type":"string","description":"The credentialSubject.id value to filter by","name":"subject","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListCredentialsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create a verifiable credential","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Create Credential","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateCredentialRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateCredentialResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/status/{id}":{"get":{"description":"Get credential status list by id.","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Get Credential Status List","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetCredentialStatusListResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/verification":{"put":{"description":"Verify a given credential by its id. The system does the following levels of verification:\n1. Makes sure the credential has a valid signature\n2. Makes sure the credential has is not expired\n3. Makes sure the credential complies with the VC Data Model\n4. If the credential has a schema, makes sure its data complies with the schema","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Verify Credential","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.VerifyCredentialRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.VerifyCredentialResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/{id}":{"get":{"description":"Get credential by id","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Get Credential","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetCredentialResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"delete":{"description":"Delete credential by ID","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Delete Credentials","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/{id}/status":{"get":{"description":"Get credential status by id","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Get Credential Status","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetCredentialStatusResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Update a credential's status","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Update Credential Status","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.UpdateCredentialStatusRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.UpdateCredentialStatusResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/dids":{"get":{"description":"Get the list of supported DID methods","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"List DID Methods","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListDIDMethodsResponse"}}}}},"/v1/dids/resolver/{id}":{"get":{"description":"Resolve a DID that may not be stored in this service","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Resolve a DID","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ResolveDIDResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/dids/{method}":{"get":{"description":"List DIDs by method. Checks for an optional \"deleted=true\" query parameter, which exclusively returns DIDs that have been \"Soft Deleted\".","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"List DIDs","parameters":[{"type":"boolean","description":"When true, returns soft-deleted DIDs. Otherwise, returns DIDs that have not been soft-deleted. Default is false.","name":"deleted","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListDIDsByMethodResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Creates a fully custodial DID document with the given method. The document created is stored internally\nand can be retrieved using the GetOperation. Method dependent registration (for example, DID web\nregistration) is left up to the clients of this API. The private key(s) created by the method are stored\ninternally never leave the service boundary.","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Create DID Document","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateDIDByMethodRequest"}},{"type":"string","description":"Method","name":"method","in":"path","required":true}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateDIDByMethodResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/dids/{method}/{id}":{"get":{"description":"Get DID by method","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Get DID","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateDIDByMethodRequest"}},{"type":"string","description":"Method","name":"method","in":"path","required":true},{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetDIDByMethodResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"When this is called with the correct did method and id it will flip the softDelete flag to true for the db entry.\nA user can still get the did if they know the DID ID, and the did keys will still exist, but this did will not show up in the ListDIDsByMethod call\nThis facilitates a clean SSI-Service Admin UI but not leave any hanging VCs with inaccessible hanging DIDs.\nSoft Deletes DID by method","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Soft Delete DID","parameters":[{"type":"string","description":"Method","name":"method","in":"path","required":true},{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/issuancetemplates":{"put":{"description":"Create issuance template","consumes":["application/json"],"produces":["application/json"],"tags":["IssuanceAPI"],"summary":"Create issuance template","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateIssuanceTemplateRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/issuancetemplates/{id}":{"get":{"description":"Get an issuance template by its id","consumes":["application/json"],"produces":["application/json"],"tags":["IssuanceAPI"],"summary":"Get issuance template","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete issuance template by ID","consumes":["application/json"],"produces":["application/json"],"tags":["IssuanceAPI"],"summary":"Delete issuance template","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/keys":{"put":{"description":"Stores a key to be used by the service","consumes":["application/json"],"produces":["application/json"],"tags":["KeyStoreAPI"],"summary":"Store Key","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.StoreKeyRequest"}}],"responses":{"201":{"description":"Created"},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/keys/{id}":{"get":{"description":"Get details about a stored key","consumes":["application/json"],"produces":["application/json"],"tags":["KeyStoreAPI"],"summary":"Get Details For Key","parameters":[{"type":"string","description":"ID of the key to get","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetKeyDetailsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Marks the stored key as being revoked, along with the timestamps of when it was revoked. NB: the key can still be used for signing. This will likely be addressed before v1 is released.","consumes":["application/json"],"produces":["application/json"],"tags":["KeyStoreAPI"],"summary":"Revoke Key","parameters":[{"type":"string","description":"ID of the key to revoke","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.RevokeKeyResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests":{"get":{"description":"Checks for the presence of a query parameter and calls the associated filtered get method","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"List manifests","parameters":[{"type":"string","description":"string issuer","name":"issuer","in":"query"},{"type":"string","description":"string schema","name":"schema","in":"query"},{"type":"string","description":"string subject","name":"subject","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListManifestsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create manifest","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Create manifest","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateManifestRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateManifestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/applications":{"get":{"description":"List all the existing applications.","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"List applications","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListApplicationsResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Submit a credential application in response to a credential manifest. The request body is expected to","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Submit application","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.SubmitApplicationRequest"}}],"responses":{"201":{"description":"Operation with a SubmitApplicationResponse type in the ` + "`" + `result.response` + "`" + ` field.","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/applications/{id}":{"get":{"description":"Get application by id","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Get application","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetApplicationResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete application by ID","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Delete applications","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/applications/{id}/review":{"put":{"description":"Reviewing an application either fulfills or denies the credential.","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Reviews an application","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.ReviewApplicationRequest"}}],"responses":{"201":{"description":"Credential Response","schema":{"$ref":"#/definitions/pkg_server_router.SubmitApplicationResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/responses":{"get":{"description":"Lists all responses","consumes":["application/json"],"produces":["application/json"],"tags":["ResponseAPI"],"summary":"List responses","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListResponsesResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/responses/{id}":{"get":{"description":"Get response by id","consumes":["application/json"],"produces":["application/json"],"tags":["ResponseAPI"],"summary":"Get response","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetResponseResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"delete":{"description":"Delete response by ID","consumes":["application/json"],"produces":["application/json"],"tags":["ResponseAPI"],"summary":"Delete responses","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/{id}":{"get":{"description":"Get a credential manifest by its id","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Get manifest","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListManifestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete manifest by ID","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Delete manifests","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/operations":{"get":{"description":"List operations according to the request","consumes":["application/json"],"produces":["application/json"],"tags":["OperationAPI"],"summary":"List operations","parameters":[{"type":"string","description":"The name of the parent's resource. For example: ` + "`" + `?parent=/presentation/submissions` + "`" + `","name":"parent","in":"query"},{"type":"string","description":"A standard filter expression conforming to https://google.aip.dev/160. For example: ` + "`" + `?filter=done=","name":"filter","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListOperationsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/operations/cancel/{id}":{"get":{"description":"Cancels an ongoing operation, if possible.","consumes":["application/json"],"produces":["application/json"],"tags":["OperationAPI"],"summary":"Cancel an ongoing operation","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/operations/{id}":{"get":{"description":"Get operation by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["OperationAPI"],"summary":"Get an operation","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/definitions":{"get":{"description":"Lists all the existing presentation definitions","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"List Presentation Definitions","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListDefinitionsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create presentation definition","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"Create PresentationDefinition","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreatePresentationDefinitionRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreatePresentationDefinitionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/definitions/{id}":{"get":{"description":"Get a presentation definition by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"Get PresentationDefinition","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetPresentationDefinitionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a presentation definition by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"Delete PresentationDefinition","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/requests":{"put":{"description":"Create presentation request from an existing presentation definition.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationRequestAPI"],"summary":"Create Presentation Request","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateRequestRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateRequestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/requests/{id}":{"get":{"description":"Get a presentation request by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationRequestAPI"],"summary":"Get Presentation Request","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetRequestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a presentation request by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationRequestAPI"],"summary":"Delete PresentationRequest","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/submissions":{"get":{"description":"List existing submissions according to a filtering query. The ` + "`" + `filter` + "`" + ` field follows the syntax described in https://google.aip.dev/160.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"List Submissions","parameters":[{"type":"string","description":"A standard filter expression conforming to https://google.aip.dev/160. For example: ` + "`" + `?filter=status=","name":"filter","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListSubmissionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Creates a submission in this server ready to be reviewed.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"Create Submission","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateSubmissionRequest"}}],"responses":{"201":{"description":"The type of response is Submission once the operation has finished.","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/submissions/{id}":{"get":{"description":"Get a submission by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"Get Submission","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetSubmissionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/presentations/submissions/{id}/review":{"put":{"description":"Reviews a pending submission. After this method is called, the operation with ` + "`" + `id==presentations/submissions/{submission_id}` + "`" + ` will be updated with the result of this invocation.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"Review a pending submission","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.ReviewSubmissionRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ReviewSubmissionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/schemas":{"get":{"description":"List schemas","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"List Schemas","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListSchemasResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create schema","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Create SchemaID","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateSchemaRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateSchemaResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/schemas/verification":{"put":{"description":"Verify a given schema by its id","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Verify SchemaID","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.VerifySchemaRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.VerifySchemaResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/schemas/{id}":{"get":{"description":"Get a schema by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Get SchemaID","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetSchemaResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a schema by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Delete SchemaID","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/webhooks":{"get":{"description":"Lists all webhooks","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"List Webhooks","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListWebhooksResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create webhook","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Create Webhook","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateWebhookRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateWebhookResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/webhooks/nouns":{"get":{"description":"Get supported nouns for webhook generation","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Get Supported Nouns","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedNounsResponse"}}}}},"/v1/webhooks/verbs":{"get":{"description":"Get supported verbs for webhook generation","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Get Supported Verbs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedVerbsResponse"}}}}},"/v1/webhooks/{noun}/{verb}":{"get":{"description":"Get a webhook by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Get Webhook","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListWebhookResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/webhooks/{noun}/{verb}/{url}":{"delete":{"description":"Delete a webhook by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Delete Webhook","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}}},"definitions":{"credential.CredentialSchema":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string"}}},"credential.CredentialSubject":{"type":"object","additionalProperties":{}},"credential.Prohibition":{"type":"object","properties":{"action":{"type":"array","items":{"type":"string"}},"assignee":{"type":"string"},"assigner":{"type":"string"},"target":{"type":"string"}}},"credential.RefreshService":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string"}}},"credential.TermsOfUse":{"type":"object","properties":{"id":{"type":"string"},"profile":{"type":"string"},"prohibition":{"type":"array","items":{"$ref":"#/definitions/credential.Prohibition"}},"type":{"type":"string"}}},"credential.VerifiableCredential":{"type":"object","required":["@context","credentialSubject","issuanceDate","issuer","type"],"properties":{"@context":{"description":"Either a string or set of strings"},"credentialSchema":{"$ref":"#/definitions/credential.CredentialSchema"},"credentialStatus":{},"credentialSubject":{"description":"This is where the subject's ID *may* be present","allOf":[{"$ref":"#/definitions/credential.CredentialSubject"}]},"evidence":{"type":"array","items":{}},"expirationDate":{"type":"string"},"id":{"type":"string"},"issuanceDate":{"description":"https://www.w3.org/TR/xmlschema11-2/#dateTimes","type":"string"},"issuer":{"description":"either a URI or an object containing an ` + "`" + `id` + "`" + ` property."},"proof":{"description":"For embedded proof support\nProof is a digital signature over a credential https://www.w3.org/TR/2021/REC-vc-data-model-20211109/#proofs-signatures"},"refreshService":{"$ref":"#/definitions/credential.RefreshService"},"termsOfUse":{"type":"array","items":{"$ref":"#/definitions/credential.TermsOfUse"}},"type":{"description":"Either a string or a set of strings https://www.w3.org/TR/2021/REC-vc-data-model-20211109/#types"}}},"credential.VerifiablePresentation":{"type":"object","required":["type"],"properties":{"@context":{"description":"Either a string or set of strings"},"holder":{"type":"string"},"id":{"type":"string"},"presentation_submission":{"description":"an optional field as a part of https://identity.foundation/presentation-exchange/#embed-targets"},"proof":{},"type":{},"verifiableCredential":{"description":"Verifiable credential could be our object model, a JWT, or any other valid credential representation","type":"array","items":{}}}},"crypto.KeyType":{"type":"string","enum":["Ed25519","X25519","secp256k1","secp256k1-ECDSA","P-224","P-256","P-384","P-521","RSA","Dilithium2","Dilithium3","Dilithium5"],"x-enum-varnames":["Ed25519","X25519","SECP256k1","SECP256k1ECDSA","P224","P256","P384","P521","RSA","Dilithium2","Dilithium3","Dilithium5"]},"crypto.SignatureAlgorithm":{"type":"string","enum":["EdDSA","ES256K","ES256","ES384","PS256","Dilithium2","Dilithium3","Dilithium5"],"x-enum-varnames":["EdDSA","ES256K","ES256","ES384","PS256","Dilithium2Sig","Dilithium3Sig","Dilithium5Sig"]},"did.Document":{"type":"object","properties":{"@context":{},"alsoKnownAs":{"type":"string"},"assertionMethod":{"type":"array","items":{}},"authentication":{"type":"array","items":{}},"capabilityDelegation":{"type":"array","items":{}},"capabilityInvocation":{"type":"array","items":{}},"controller":{"type":"string"},"id":{"description":"As per https://www.w3.org/TR/did-core/#did-subject intermediate representations of DID Documents do not\nrequire an ID property. The provided test vectors demonstrate IRs. As such, the property is optional.","type":"string"},"keyAgreement":{"type":"array","items":{}},"service":{"type":"array","items":{"$ref":"#/definitions/github_com_TBD54566975_ssi-sdk_did.Service"}},"verificationMethod":{"type":"array","items":{"$ref":"#/definitions/did.VerificationMethod"}}}},"did.Method":{"type":"string","enum":["key","peer","pkh","web","ion","jwk"],"x-enum-varnames":["KeyMethod","PeerMethod","PKHMethod","WebMethod","IONMethod","JWKMethod"]},"did.VerificationMethod":{"type":"object","required":["controller","id","type"],"properties":{"blockchainAccountId":{"description":"for PKH DIDs - https://github.com/w3c-ccg/did-pkh/blob/90b28ad3c18d63822a8aab3c752302aa64fc9382/did-pkh-method-draft.md","type":"string"},"controller":{"type":"string"},"id":{"type":"string"},"publicKeyBase58":{"type":"string"},"publicKeyJwk":{"description":"must conform to https://datatracker.ietf.org/doc/html/rfc7517","allOf":[{"$ref":"#/definitions/jwx.PublicKeyJWK"}]},"publicKeyMultibase":{"description":"https://datatracker.ietf.org/doc/html/draft-multiformats-multibase-03","type":"string"},"type":{"type":"string"}}},"exchange.ClaimFormat":{"type":"object","properties":{"jwt":{"$ref":"#/definitions/exchange.JWTType"},"jwt_vc":{"$ref":"#/definitions/exchange.JWTType"},"jwt_vp":{"$ref":"#/definitions/exchange.JWTType"},"ldp":{"$ref":"#/definitions/exchange.LDPType"},"ldp_vc":{"$ref":"#/definitions/exchange.LDPType"},"ldp_vp":{"$ref":"#/definitions/exchange.LDPType"}}},"exchange.Constraints":{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/definitions/exchange.Field"}},"is_holder":{"type":"array","items":{"$ref":"#/definitions/exchange.RelationalConstraint"}},"limit_disclosure":{"$ref":"#/definitions/exchange.Preference"},"same_subject":{"type":"array","items":{"$ref":"#/definitions/exchange.RelationalConstraint"}},"statuses":{"description":"https://identity.foundation/presentation-exchange/#credential-status-constraint-feature","allOf":[{"$ref":"#/definitions/exchange.CredentialStatus"}]},"subject_is_issuer":{"description":"https://identity.foundation/presentation-exchange/#relational-constraint-feature","allOf":[{"$ref":"#/definitions/exchange.Preference"}]}}},"exchange.CredentialStatus":{"type":"object","properties":{"active":{"type":"object","properties":{"directive":{"$ref":"#/definitions/exchange.Preference"}}},"revoked":{"type":"object","properties":{"directive":{"$ref":"#/definitions/exchange.Preference"}}},"suspended":{"type":"object","properties":{"directive":{"$ref":"#/definitions/exchange.Preference"}}}}},"exchange.Field":{"type":"object","required":["path"],"properties":{"filter":{"$ref":"#/definitions/exchange.Filter"},"id":{"type":"string"},"intent_to_retain":{"description":"https://identity.foundation/presentation-exchange/spec/v2.0.0/#retention-feature","type":"boolean"},"name":{"type":"string"},"optional":{"type":"boolean"},"path":{"type":"array","items":{"type":"string"}},"predicate":{"description":"If a predicate property is present, filter must be too\nhttps://identity.foundation/presentation-exchange/#predicate-feature","allOf":[{"$ref":"#/definitions/exchange.Preference"}]},"purpose":{"type":"string"}}},"exchange.Filter":{"type":"object","properties":{"additionalProperties":{"type":"boolean"},"allOf":{},"const":{},"enum":{"type":"array","items":{}},"exclusiveMaximum":{},"exclusiveMinimum":{},"format":{"type":"string"},"maxLength":{"type":"integer"},"maximum":{},"minLength":{"type":"integer"},"minimum":{},"not":{},"oneOf":{},"pattern":{"type":"string"},"properties":{},"required":{"type":"array","items":{"type":"string"}},"type":{"type":"string"}}},"exchange.InputDescriptor":{"type":"object","required":["constraints","id"],"properties":{"constraints":{"$ref":"#/definitions/exchange.Constraints"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"group":{"description":"Must match a grouping strings listed in the ` + "`" + `from` + "`" + ` values of a submission requirement rule","type":"array","items":{"type":"string"}},"id":{"description":"Must be unique within the Presentation Definition","type":"string"},"name":{"type":"string"},"purpose":{"description":"Purpose for which claim's data is being requested","type":"string"}}},"exchange.JWTType":{"type":"object","required":["alg"],"properties":{"alg":{"type":"array","items":{"$ref":"#/definitions/crypto.SignatureAlgorithm"}}}},"exchange.LDPType":{"type":"object","required":["proof_type"],"properties":{"proof_type":{"type":"array","items":{"type":"string"}}}},"exchange.Preference":{"type":"string","enum":["required","preferred","allowed","disallowed"],"x-enum-varnames":["Required","Preferred","Allowed","Disallowed"]},"exchange.PresentationDefinition":{"type":"object","required":["id","input_descriptors"],"properties":{"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"frame":{"description":"https://identity.foundation/presentation-exchange/#json-ld-framing-feature"},"id":{"type":"string"},"input_descriptors":{"type":"array","items":{"$ref":"#/definitions/exchange.InputDescriptor"}},"name":{"type":"string"},"purpose":{"type":"string"},"submission_requirements":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionRequirement"}}}},"exchange.PresentationSubmission":{"type":"object","required":["definition_id","descriptor_map","id"],"properties":{"definition_id":{"type":"string"},"descriptor_map":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionDescriptor"}},"id":{"type":"string"}}},"exchange.RelationalConstraint":{"type":"object","required":["directive","field_id"],"properties":{"directive":{"$ref":"#/definitions/exchange.Preference"},"field_id":{"type":"array","items":{"type":"string"}}}},"exchange.Selection":{"type":"string","enum":["all","pick"],"x-enum-varnames":["All","Pick"]},"exchange.SubmissionDescriptor":{"type":"object","required":["format","id","path"],"properties":{"format":{"type":"string"},"id":{"description":"Must match the ` + "`" + `id` + "`" + ` property of the corresponding input descriptor","type":"string"},"path":{"type":"string"},"path_nested":{"$ref":"#/definitions/exchange.SubmissionDescriptor"}}},"exchange.SubmissionRequirement":{"type":"object","required":["rule"],"properties":{"count":{"type":"integer","minimum":1},"from":{"type":"string"},"from_nested":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionRequirement"}},"max":{"type":"integer"},"min":{"type":"integer"},"name":{"type":"string"},"purpose":{"type":"string"},"rule":{"$ref":"#/definitions/exchange.Selection"}}},"github_com_TBD54566975_ssi-sdk_did.Service":{"type":"object","required":["id","serviceEndpoint","type"],"properties":{"accept":{"type":"array","items":{"type":"string"}},"id":{"type":"string"},"routingKeys":{"type":"array","items":{"type":"string"}},"serviceEndpoint":{"description":"A string, map, or set composed of one or more strings and/or maps\nAll string values must be valid URIs"},"type":{"type":"string"}}},"github_com_tbd54566975_ssi-service_internal_credential.Container":{"type":"object","properties":{"credential":{"$ref":"#/definitions/credential.VerifiableCredential"},"credentialJwt":{"type":"string"},"id":{"description":"Credential ID","type":"string"},"issuerKid":{"type":"string"},"revoked":{"type":"boolean"},"suspended":{"type":"boolean"}}},"github_com_tbd54566975_ssi-service_pkg_service_framework.Status":{"type":"object","properties":{"message":{"description":"When ` + "`" + `status` + "`" + ` is ` + "`" + `not_ready` + "`" + `, then message contains explanation of why it's not ready.","type":"string"},"status":{"description":"Either ` + "`" + `ready` + "`" + ` or ` + "`" + `not_ready` + "`" + `.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_framework.StatusState"}]}}},"github_com_tbd54566975_ssi-service_pkg_service_framework.StatusState":{"type":"string","enum":["ready","not_ready"],"x-enum-varnames":["StatusReady","StatusNotReady"]},"github_com_tbd54566975_ssi-service_pkg_service_issuance.ClaimTemplates":{"type":"object","additionalProperties":{}},"github_com_tbd54566975_ssi-service_pkg_service_issuance.CredentialTemplate":{"type":"object","properties":{"credentialInputDescriptor":{"description":"Optional.\nWhen present, it's the ID of the input descriptor in the application. Corresponds to one of the\nPresentationDefinition.InputDescriptors[].ID in the credential manifest. When creating a credential, the base\ndata will be populated from the provided submission that matches this ID.\nWhen absent, there will be no base data for the credentials created. Additionally, no JSON path strings in\nClaimTemplates.Data will be resolved.","type":"string"},"data":{"description":"Data that will be used to determine credential claims.\nValues may be json path like strings, or any other JSON primitive. Each entry will be used to come up with a\nclaim about the credentialSubject in the credential that will be issued.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.ClaimTemplates"}]},"expiry":{"description":"Parameter to determine the expiry of the credential.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.TimeLike"}]},"id":{"description":"ID corresponding to an OutputDescriptor.ID from the manifest.","type":"string"},"revocable":{"description":"Whether the credentials created should be revocable.","type":"boolean"},"schema":{"description":"ID of the CredentialSchema to be used for the issued credential.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_issuance.Template":{"type":"object","required":["credentialManifest","issuer","issuerKid"],"properties":{"credentialManifest":{"description":"ID of the credential manifest that this template corresponds to.","type":"string"},"credentials":{"description":"Info required to create a credential from a credential application.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.CredentialTemplate"}},"id":{"description":"ID of this template.","type":"string"},"issuer":{"description":"ID of the issuer that will be issuance the credentials.","type":"string"},"issuerKid":{"description":"ID of the key that will be used to sign the credentials.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_issuance.TimeLike":{"type":"object","properties":{"duration":{"description":"For a fixed offset from when it was issued.","allOf":[{"$ref":"#/definitions/time.Duration"}]},"time":{"description":"For fixed time in the future.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_manifest_model.CredentialOverride":{"type":"object","properties":{"data":{"description":"Data that will be used to determine credential claims.","type":"object","additionalProperties":{}},"expiry":{"description":"Parameter to determine the expiry of the credential.","type":"string"},"revocable":{"description":"Whether the credentials created should be revocable.","type":"boolean"}}},"github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request":{"type":"object","required":["expiration","issuerId","issuerKid","presentationDefinitionId"],"properties":{"audience":{"description":"Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3.","type":"array","items":{"type":"string"}},"expiration":{"description":"Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4","type":"string"},"id":{"description":"ID for this request. It matches the \"jti\" claim in the JWT.\nThis is an output only field.","type":"string"},"issuerId":{"description":"DID of the issuer of this presentation definition.","type":"string"},"issuerKid":{"description":"The privateKey associated with the KID used to sign the JWT.","type":"string"},"presentationDefinitionId":{"description":"ID of the presentation definition used for this request.","type":"string"},"presentationRequestJwt":{"description":"PresentationDefinitionJWT is a JWT token with a \"presentation_definition\" claim within it. The\nvalue of the field named \"presentation_definition.id\" matches PresentationDefinitionID.\nThis is an output only field.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Submission":{"type":"object","required":["status"],"properties":{"reason":{"description":"The reason why the submission was approved or denied.","type":"string"},"status":{"description":"One of {` + "`" + `pending` + "`" + `, ` + "`" + `approved` + "`" + `, ` + "`" + `denied` + "`" + `, ` + "`" + `cancelled` + "`" + `}.","type":"string"},"verifiablePresentation":{"description":"The verifiable presentation containing the presentation_submission along with the credentials presented.","allOf":[{"$ref":"#/definitions/credential.VerifiablePresentation"}]}}},"github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedNounsResponse":{"type":"object","properties":{"nouns":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun"}}}},"github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedVerbsResponse":{"type":"object","properties":{"verbs":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb"}}}},"github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun":{"type":"string","enum":["Credential","DID","Manifest","SchemaID","Presentation","Application","Submission"],"x-enum-varnames":["Credential","DID","Manifest","Schema","Presentation","Application","Submission"]},"github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb":{"type":"string","enum":["Create","Delete"],"x-enum-varnames":["Create","Delete"]},"github_com_tbd54566975_ssi-service_pkg_service_webhook.Webhook":{"type":"object","required":["noun","urls","verb"],"properties":{"noun":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun"},"urls":{"type":"array","items":{"type":"string"}},"verb":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb"}}},"jwx.PublicKeyJWK":{"type":"object","required":["kty"],"properties":{"alg":{"type":"string"},"crv":{"type":"string"},"e":{"type":"string"},"key_ops":{"type":"string"},"kid":{"type":"string"},"kty":{"type":"string"},"n":{"type":"string"},"use":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"manifest.CredentialApplication":{"type":"object","required":["format","id","manifest_id","spec_version"],"properties":{"applicant":{"type":"string"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"id":{"type":"string"},"manifest_id":{"type":"string"},"presentation_submission":{"description":"Must be present if the corresponding manifest contains a presentation_definition","allOf":[{"$ref":"#/definitions/exchange.PresentationSubmission"}]},"spec_version":{"type":"string"}}},"manifest.CredentialManifest":{"type":"object","required":["id","issuer","output_descriptors","spec_version"],"properties":{"description":{"type":"string"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"id":{"type":"string"},"issuer":{"$ref":"#/definitions/manifest.Issuer"},"name":{"type":"string"},"output_descriptors":{"type":"array","items":{"$ref":"#/definitions/manifest.OutputDescriptor"}},"presentation_definition":{"$ref":"#/definitions/exchange.PresentationDefinition"},"spec_version":{"type":"string"}}},"manifest.CredentialResponse":{"type":"object","required":["id","manifest_id","spec_version"],"properties":{"applicant":{"type":"string"},"application_id":{"type":"string"},"denial":{"type":"object","required":["reason"],"properties":{"input_descriptors":{"type":"array","items":{"type":"string"}},"reason":{"type":"string"}}},"fulfillment":{"type":"object","required":["descriptor_map"],"properties":{"descriptor_map":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionDescriptor"}}}},"id":{"type":"string"},"manifest_id":{"type":"string"},"spec_version":{"type":"string"}}},"manifest.Issuer":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"styles":{"description":"an object or URI as defined by the DIF Entity Styles specification\nhttps://identity.foundation/wallet-rendering/#entity-styles","allOf":[{"$ref":"#/definitions/rendering.EntityStyleDescriptor"}]}}},"manifest.OutputDescriptor":{"type":"object","required":["id","schema"],"properties":{"description":{"type":"string"},"display":{"description":"both below: an object or URI as defined by the DIF Entity Styles specification","allOf":[{"$ref":"#/definitions/rendering.DataDisplay"}]},"id":{"description":"Must be unique within a manifest","type":"string"},"name":{"type":"string"},"schema":{"type":"string"},"styles":{"$ref":"#/definitions/rendering.EntityStyleDescriptor"}}},"pkg_server_router.CreateCredentialRequest":{"type":"object","required":["data","issuer","issuerKid","subject"],"properties":{"@context":{"description":"A context is optional. If not present, we'll apply default, required context values.","type":"string"},"data":{"description":"Claims about the subject. The keys should be predicates (e.g. \"alumniOf\"), and the values can be any object.","type":"object","additionalProperties":{"type":"string"},"example":{"alumniOf":"did_for_uni"}},"expiry":{"description":"Optional. Corresponds to ` + "`" + `expirationDate` + "`" + ` in https://www.w3.org/TR/vc-data-model/#expiration.","type":"string","example":"2020-01-01T19:23:24Z"},"issuer":{"description":"The issuer id.","type":"string","example":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp"},"issuerKid":{"description":"The KID used to sign the credential","type":"string","example":"#z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp"},"revocable":{"description":"Whether this credential can be revoked. When true, the created VC will have the \"credentialStatus\"\nproperty set.","type":"boolean"},"schemaId":{"description":"A schema ID is optional. If present, we'll attempt to look it up and validate the data against it.","type":"string"},"subject":{"description":"The subject id.","type":"string","example":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp"},"suspendable":{"description":"Whether this credential can be suspended. When true, the created VC will have the \"credentialStatus\"\nproperty set.","type":"boolean"}}},"pkg_server_router.CreateCredentialResponse":{"type":"object","properties":{"credential":{"description":"A verifiable credential conformant to the media type ` + "`" + `application/vc+ld+json` + "`" + `.","allOf":[{"$ref":"#/definitions/credential.VerifiableCredential"}]},"credentialJwt":{"description":"The same verifiable credential, but using the syntax defined for the media type ` + "`" + `application/vc+jwt` + "`" + `. See\nhttps://w3c.github.io/vc-jwt/ for more details.","type":"string"}}},"pkg_server_router.CreateDIDByMethodRequest":{"type":"object","required":["keyType"],"properties":{"keyType":{"description":"Identifies the cryptographic algorithm family to use when generating this key.\nOne of the following: \"Ed25519\", \"X25519\", \"secp256k1\", \"P-224\",\"P-256\",\"P-384\", \"P-521\", \"RSA\"","allOf":[{"$ref":"#/definitions/crypto.KeyType"}]},"options":{"description":"Options for creating the DID. Implementation dependent on the method."}}},"pkg_server_router.CreateDIDByMethodResponse":{"type":"object","properties":{"did":{"$ref":"#/definitions/did.Document"}}},"pkg_server_router.CreateIssuanceTemplateRequest":{"type":"object","required":["credentialManifest","issuer","issuerKid"],"properties":{"credentialManifest":{"description":"ID of the credential manifest that this template corresponds to.","type":"string"},"credentials":{"description":"Info required to create a credential from a credential application.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.CredentialTemplate"}},"id":{"description":"ID of this template.","type":"string"},"issuer":{"description":"ID of the issuer that will be issuance the credentials.","type":"string"},"issuerKid":{"description":"ID of the key that will be used to sign the credentials.","type":"string"}}},"pkg_server_router.CreateManifestRequest":{"type":"object","required":["format","issuerDid","issuerKid","outputDescriptors"],"properties":{"description":{"type":"string"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"issuerDid":{"type":"string"},"issuerKid":{"type":"string"},"issuerName":{"type":"string"},"name":{"type":"string"},"outputDescriptors":{"type":"array","items":{"$ref":"#/definitions/manifest.OutputDescriptor"}},"presentationDefinition":{"$ref":"#/definitions/exchange.PresentationDefinition"}}},"pkg_server_router.CreateManifestResponse":{"type":"object","properties":{"credential_manifest":{"$ref":"#/definitions/manifest.CredentialManifest"},"manifestJwt":{"type":"string"}}},"pkg_server_router.CreatePresentationDefinitionRequest":{"type":"object","required":["inputDescriptors"],"properties":{"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"inputDescriptors":{"type":"array","items":{"$ref":"#/definitions/exchange.InputDescriptor"}},"name":{"type":"string"},"purpose":{"type":"string"},"submissionRequirements":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionRequirement"}}}},"pkg_server_router.CreatePresentationDefinitionResponse":{"type":"object","properties":{"presentationDefinitionJwt":{"description":"Signed envelope that contains the PresentationDefinition created using the privateKey of the author of the\ndefinition.","type":"string"},"presentation_definition":{"$ref":"#/definitions/exchange.PresentationDefinition"}}},"pkg_server_router.CreateRequestRequest":{"type":"object","required":["issuerId","issuerKid","presentationDefinitionId"],"properties":{"audience":{"description":"Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3\nOptional","type":"array","items":{"type":"string"}},"expiration":{"description":"Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4\nOptional. When not specified, the request will be valid for a default duration.","type":"string"},"issuerId":{"description":"DID of the issuer of this presentation definition. The DID must have been previously created with the DID API,\nor the PrivateKey must have been added independently.","type":"string"},"issuerKid":{"description":"The privateKey associated with the KID will be used to sign an envelope that contains\nthe created presentation definition.","type":"string"},"presentationDefinitionId":{"description":"ID of the presentation definition to use for this request.","type":"string"}}},"pkg_server_router.CreateRequestResponse":{"type":"object","properties":{"presentationRequest":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request"}}},"pkg_server_router.CreateSchemaRequest":{"type":"object","required":["author","name","schema"],"properties":{"author":{"type":"string"},"authorKid":{"description":"AuthorKID represents the KID of the author's private key to sign the schema. Required if sign is true.","type":"string"},"name":{"type":"string"},"schema":{"$ref":"#/definitions/schema.JSONSchema"},"sign":{"description":"Sign represents whether the schema should be signed by the author. Default is false.\nIf sign is true, the schema will be signed by the author's private key with the specified KID","type":"boolean"}}},"pkg_server_router.CreateSchemaResponse":{"type":"object","properties":{"id":{"type":"string"},"schema":{"$ref":"#/definitions/schema.VCJSONSchema"},"schemaJwt":{"type":"string"}}},"pkg_server_router.CreateSubmissionRequest":{"type":"object","required":["submissionJwt"],"properties":{"submissionJwt":{"description":"A Verifiable Presentation that's encoded as a JWT.\nVerifiable Presentation are described in https://www.w3.org/TR/vc-data-model/#presentations-0\nJWT encoding of the Presentation as described in https://www.w3.org/TR/vc-data-model/#presentations-0","type":"string"}}},"pkg_server_router.CreateWebhookRequest":{"type":"object","required":["noun","url","verb"],"properties":{"noun":{"description":"The noun (entity) for the new webhook.eg: Credential","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun"}]},"url":{"description":"The URL to post the output of this request to Noun.Verb action to.","type":"string"},"verb":{"description":"The verb for the new webhook.eg: Create","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb"}]}}},"pkg_server_router.CreateWebhookResponse":{"type":"object","properties":{"webhook":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Webhook"}}},"pkg_server_router.GetApplicationResponse":{"type":"object","properties":{"application":{"$ref":"#/definitions/manifest.CredentialApplication"},"id":{"type":"string"}}},"pkg_server_router.GetCredentialResponse":{"type":"object","properties":{"credential":{"$ref":"#/definitions/credential.VerifiableCredential"},"credentialJwt":{"type":"string"},"id":{"type":"string"}}},"pkg_server_router.GetCredentialStatusListResponse":{"type":"object","properties":{"credential":{"description":"Credential where type includes \"VerifiableCredential\" and \"StatusList2021\".","allOf":[{"$ref":"#/definitions/credential.VerifiableCredential"}]},"credentialJwt":{"description":"The JWT signed with the associated issuer's private key.","type":"string"},"id":{"type":"string"}}},"pkg_server_router.GetCredentialStatusResponse":{"type":"object","properties":{"revoked":{"description":"Whether the credential has been revoked.","type":"boolean"},"suspended":{"description":"Whether the credential has been suspended.","type":"boolean"}}},"pkg_server_router.GetDIDByMethodResponse":{"type":"object","properties":{"did":{"$ref":"#/definitions/did.Document"}}},"pkg_server_router.GetHealthCheckResponse":{"type":"object","properties":{"status":{"description":"Status is always equal to ` + "`" + `OK` + "`" + `.","type":"string"}}},"pkg_server_router.GetKeyDetailsResponse":{"type":"object","properties":{"controller":{"type":"string"},"createdAt":{"description":"Represents the time at which the key was created. Encoded according to RFC3339.","type":"string"},"id":{"type":"string"},"publicKeyJwk":{"description":"The public key in JWK format according to RFC7517. This public key is associated with the private\nkey with the associated ID.","allOf":[{"$ref":"#/definitions/jwx.PublicKeyJWK"}]},"type":{"$ref":"#/definitions/crypto.KeyType"}}},"pkg_server_router.GetPresentationDefinitionResponse":{"type":"object","properties":{"presentation_definition":{"$ref":"#/definitions/exchange.PresentationDefinition"}}},"pkg_server_router.GetReadinessResponse":{"type":"object","properties":{"serviceStatuses":{"description":"A map from the name of the service ot the status of that current service.","type":"object","additionalProperties":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_framework.Status"}},"status":{"description":"Overall status of the ssi service.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_framework.Status"}]}}},"pkg_server_router.GetRequestResponse":{"type":"object","properties":{"presentationRequest":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request"}}},"pkg_server_router.GetResponseResponse":{"type":"object","properties":{"credential_response":{"$ref":"#/definitions/manifest.CredentialResponse"},"responseJwt":{"type":"string"},"verifiableCredentials":{"description":"this is an interface type to union Data Integrity and JWT style VCs"}}},"pkg_server_router.GetSchemaResponse":{"type":"object","properties":{"schema":{"$ref":"#/definitions/schema.VCJSONSchema"},"schemaJwt":{"type":"string"}}},"pkg_server_router.GetSubmissionResponse":{"type":"object","required":["status"],"properties":{"reason":{"description":"The reason why the submission was approved or denied.","type":"string"},"status":{"description":"One of {` + "`" + `pending` + "`" + `, ` + "`" + `approved` + "`" + `, ` + "`" + `denied` + "`" + `, ` + "`" + `cancelled` + "`" + `}.","type":"string"},"verifiablePresentation":{"description":"The verifiable presentation containing the presentation_submission along with the credentials presented.","allOf":[{"$ref":"#/definitions/credential.VerifiablePresentation"}]}}},"pkg_server_router.ListApplicationsResponse":{"type":"object","properties":{"applications":{"type":"array","items":{"$ref":"#/definitions/manifest.CredentialApplication"}}}},"pkg_server_router.ListCredentialsResponse":{"type":"object","properties":{"credentials":{"description":"Array of credential containers.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_internal_credential.Container"}}}},"pkg_server_router.ListDIDMethodsResponse":{"type":"object","properties":{"method":{"type":"array","items":{"$ref":"#/definitions/did.Method"}}}},"pkg_server_router.ListDIDsByMethodResponse":{"type":"object","properties":{"dids":{"type":"array","items":{"$ref":"#/definitions/did.Document"}}}},"pkg_server_router.ListDefinitionsResponse":{"type":"object","properties":{"definitions":{"type":"array","items":{"$ref":"#/definitions/exchange.PresentationDefinition"}}}},"pkg_server_router.ListIssuanceTemplatesResponse":{"type":"object","properties":{"issuanceTemplates":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template"}}}},"pkg_server_router.ListManifestResponse":{"type":"object","properties":{"credential_manifest":{"$ref":"#/definitions/manifest.CredentialManifest"},"id":{"type":"string"},"manifestJwt":{"type":"string"}}},"pkg_server_router.ListManifestsResponse":{"type":"object","properties":{"manifests":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.ListManifestResponse"}}}},"pkg_server_router.ListOperationsResponse":{"type":"object","properties":{"operations":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.Operation"}}}},"pkg_server_router.ListResponsesResponse":{"type":"object","properties":{"responses":{"type":"array","items":{"$ref":"#/definitions/manifest.CredentialResponse"}}}},"pkg_server_router.ListSchemasResponse":{"type":"object","properties":{"schemas":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.GetSchemaResponse"}}}},"pkg_server_router.ListSubmissionResponse":{"type":"object","properties":{"submissions":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Submission"}}}},"pkg_server_router.ListWebhookResponse":{"type":"object","properties":{"webhook":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Webhook"}}},"pkg_server_router.ListWebhooksResponse":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.ListWebhookResponse"}}}},"pkg_server_router.Operation":{"type":"object","required":["done","id"],"properties":{"done":{"description":"Whether this operation has finished.","type":"boolean"},"id":{"description":"The name of the resource related to this operation. E.g. \"presentations/submissions/\u003cuuid\u003e\"","type":"string"},"result":{"description":"Populated if Done == true.","allOf":[{"$ref":"#/definitions/pkg_server_router.OperationResult"}]}}},"pkg_server_router.OperationResult":{"type":"object","properties":{"error":{"description":"Populated when there was an error with the operation.","type":"string"},"response":{"description":"Populated iff Error == \"\". The type should be specified in the calling APIs documentation."}}},"pkg_server_router.ResolveDIDResponse":{"type":"object","properties":{"didDocument":{"$ref":"#/definitions/did.Document"},"didDocumentMetadata":{"$ref":"#/definitions/resolution.DocumentMetadata"},"didResolutionMetadata":{"$ref":"#/definitions/resolution.ResolutionMetadata"}}},"pkg_server_router.ReviewApplicationRequest":{"type":"object","properties":{"approved":{"type":"boolean"},"credentialOverrides":{"description":"Overrides to apply to the credentials that will be created. Keys are the ID that corresponds to an\nOutputDescriptor.ID from the manifest.","type":"object","additionalProperties":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.CredentialOverride"}},"reason":{"type":"string"}}},"pkg_server_router.ReviewSubmissionRequest":{"type":"object","required":["approved"],"properties":{"approved":{"type":"boolean"},"reason":{"type":"string"}}},"pkg_server_router.ReviewSubmissionResponse":{"type":"object","required":["status"],"properties":{"reason":{"description":"The reason why the submission was approved or denied.","type":"string"},"status":{"description":"One of {` + "`" + `pending` + "`" + `, ` + "`" + `approved` + "`" + `, ` + "`" + `denied` + "`" + `, ` + "`" + `cancelled` + "`" + `}.","type":"string"},"verifiablePresentation":{"description":"The verifiable presentation containing the presentation_submission along with the credentials presented.","allOf":[{"$ref":"#/definitions/credential.VerifiablePresentation"}]}}},"pkg_server_router.RevokeKeyResponse":{"type":"object","properties":{"id":{"type":"string"}}},"pkg_server_router.StoreKeyRequest":{"type":"object","required":["base58PrivateKey","controller","id","type"],"properties":{"base58PrivateKey":{"description":"Base58 encoding of the bytes that result from marshalling the private key using golang's implementation.","type":"string"},"controller":{"description":"See https://www.w3.org/TR/did-core/#did-controller","type":"string"},"id":{"description":"The ` + "`" + `id` + "`" + ` field is the unique identifier for this object. If set to a resolvable DID, the ssi-service will use\nthe private key encoded in the ` + "`" + `PrivateKeyBase58` + "`" + ` field of this object to sign objects issued or authored by this\nDID; otherwise, it will only be used to identify this object.","type":"string"},"type":{"description":"Identifies the cryptographic algorithm family used with the key.\nOne of the following: \"Ed25519\", \"X25519\", \"secp256k1\", \"P-224\", \"P-256\", \"P-384\", \"P-521\", \"RSA\".","allOf":[{"$ref":"#/definitions/crypto.KeyType"}]}}},"pkg_server_router.SubmitApplicationRequest":{"type":"object","required":["applicationJwt"],"properties":{"applicationJwt":{"description":"Contains the following properties:\nApplication  manifestsdk.CredentialApplication ` + "`" + `json:\"credential_application\" validate:\"required\"` + "`" + `\nCredentials  []interface{}                     ` + "`" + `json:\"vcs\" validate:\"required\"` + "`" + `","type":"string"}}},"pkg_server_router.SubmitApplicationResponse":{"type":"object","properties":{"credential_response":{"$ref":"#/definitions/manifest.CredentialResponse"},"responseJwt":{"type":"string"},"verifiableCredentials":{"description":"this is an any type to union Data Integrity and JWT style VCs","type":"array","items":{}}}},"pkg_server_router.UpdateCredentialStatusRequest":{"type":"object","properties":{"revoked":{"description":"The new revoked status of this credential. The status will be saved in the encodedList of the StatusList2021\ncredential associated with this VC.","type":"boolean"},"suspended":{"type":"boolean"}}},"pkg_server_router.UpdateCredentialStatusResponse":{"type":"object","properties":{"revoked":{"description":"The updated status of this credential.","type":"boolean"},"suspended":{"type":"boolean"}}},"pkg_server_router.VerifyCredentialRequest":{"type":"object","properties":{"credential":{"description":"A credential secured via data integrity. Must have the \"proof\" property set.","allOf":[{"$ref":"#/definitions/credential.VerifiableCredential"}]},"credentialJwt":{"description":"A JWT that encodes a credential.","type":"string"}}},"pkg_server_router.VerifyCredentialResponse":{"type":"object","properties":{"reason":{"description":"The reason why this credential couldn't be verified.","type":"string"},"verified":{"description":"Whether the credential was verified.","type":"boolean"}}},"pkg_server_router.VerifySchemaRequest":{"type":"object","required":["schemaJwt"],"properties":{"schemaJwt":{"type":"string"}}},"pkg_server_router.VerifySchemaResponse":{"type":"object","required":["verified"],"properties":{"reason":{"type":"string"},"verified":{"type":"boolean"}}},"rendering.ColorResource":{"type":"object","properties":{"color":{"description":"a HEX string color value (e.g. #00000)","type":"string"}}},"rendering.DataDisplay":{"type":"object","properties":{"description":{"$ref":"#/definitions/rendering.DisplayMappingObject"},"properties":{"type":"array","items":{"$ref":"#/definitions/rendering.LabeledDisplayMappingObject"}},"subtitle":{"$ref":"#/definitions/rendering.DisplayMappingObject"},"title":{"$ref":"#/definitions/rendering.DisplayMappingObject"}}},"rendering.DisplayMappingObject":{"type":"object","properties":{"fallback":{"type":"string"},"path":{"description":"Ifa path is present it must be an array of JSON Path string expressions\nand the schema property must also be present.","type":"array","items":{"type":"string"}},"schema":{"$ref":"#/definitions/rendering.DisplayMappingSchema"},"text":{"description":"If path is not present, the text value is required with no other properties","type":"string"}}},"rendering.DisplayMappingSchema":{"type":"object","required":["type"],"properties":{"format":{"description":"Must be present if the value of the type property is \"string\"","allOf":[{"$ref":"#/definitions/rendering.SchemaFormat"}]},"type":{"$ref":"#/definitions/rendering.SchemaType"}}},"rendering.EntityStyleDescriptor":{"type":"object","properties":{"background":{"$ref":"#/definitions/rendering.ColorResource"},"hero":{"$ref":"#/definitions/rendering.ImageResource"},"text":{"$ref":"#/definitions/rendering.ColorResource"},"thumbnail":{"$ref":"#/definitions/rendering.ImageResource"}}},"rendering.ImageResource":{"type":"object","required":["uri"],"properties":{"alt":{"description":"Describes the alternate text for a logo image","type":"string"},"uri":{"description":"Must be a valid URI string to an image resource","type":"string"}}},"rendering.LabeledDisplayMappingObject":{"type":"object","required":["label"],"properties":{"fallback":{"type":"string"},"label":{"type":"string"},"path":{"description":"Ifa path is present it must be an array of JSON Path string expressions\nand the schema property must also be present.","type":"array","items":{"type":"string"}},"schema":{"$ref":"#/definitions/rendering.DisplayMappingSchema"},"text":{"description":"If path is not present, the text value is required with no other properties","type":"string"}}},"rendering.SchemaFormat":{"type":"string","enum":["date-time","time","date","email","idn-email","hostname","idn-hostname","ipv4","ipv6","uri","uri-reference","iri","iri-reference"],"x-enum-varnames":["DateTimeFormat","TimeFormat","DateFormat","EmailFormat","IDNEmailFormat","HostnameFormat","IDNHostnameFormat","IPV4Format","IPV6Format","URIFormat","URIReferenceFormat","IRIFormat","IRIReferenceFormat"]},"rendering.SchemaType":{"type":"string","enum":["string","boolean","number","integer"],"x-enum-varnames":["StringType","BooleanType","NumberType","IntegerType"]},"resolution.DocumentMetadata":{"type":"object","properties":{"canonicalId":{"type":"string"},"created":{"type":"string"},"deactivated":{"type":"boolean"},"equivalentId":{"type":"string"},"nextUpdate":{"type":"string"},"nextVersionId":{"type":"string"},"updated":{"type":"string"},"versionId":{"type":"string"}}},"resolution.ResolutionError":{"type":"object","properties":{"code":{"type":"string"},"invalidDid":{"type":"boolean"},"notFound":{"type":"boolean"},"representationNotSupported":{"type":"boolean"}}},"resolution.ResolutionMetadata":{"type":"object","properties":{"contentType":{"type":"string"},"error":{"$ref":"#/definitions/resolution.ResolutionError"}}},"schema.JSONSchema":{"type":"object","additionalProperties":{}},"schema.VCJSONSchema":{"type":"object","properties":{"author":{"type":"string"},"authored":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"schema":{"$ref":"#/definitions/schema.JSONSchema"},"type":{"type":"string"},"version":{"type":"string"}}},"time.Duration":{"type":"integer","enum":[-9223372036854775808,9223372036854775807,1,1000,1000000,1000000000,60000000000,3600000000000],"x-enum-varnames":["minDuration","maxDuration","Nanosecond","Microsecond","Millisecond","Second","Minute","Hour"]}}}`
+    "schemes": {{ marshal .Schemes }},"swagger":"2.0","info":{"description":"{{escape .Description}}","title":"{{.Title}}","contact":{"name":"TBD","url":"https://github.com/TBD54566975/ssi-service/issues","email":"tbd-developer@squareup.com"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"{{.Version}}"},"host":"{{.Host}}","basePath":"{{.BasePath}}","paths":{"/health":{"get":{"description":"Health is a simple handler that always responds with a 200 OK","consumes":["application/json"],"produces":["application/json"],"tags":["HealthCheck"],"summary":"Health Check","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetHealthCheckResponse"}}}}},"/readiness":{"get":{"description":"Readiness runs a number of application specific checks to see if all the relied upon services are\nhealthy.","consumes":["application/json"],"produces":["application/json"],"tags":["Readiness"],"summary":"Readiness","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetReadinessResponse"}}}}},"/v1/credentials":{"get":{"description":"Checks for the presence of a query parameter and calls the associated filtered get method. Only one parameter is allowed to be specified.","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"List Credentials","parameters":[{"type":"string","example":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp","description":"The issuer id","name":"issuer","in":"query"},{"type":"string","description":"The credentialSchema.id value to filter by","name":"schema","in":"query"},{"type":"string","description":"The credentialSubject.id value to filter by","name":"subject","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListCredentialsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create a verifiable credential","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Create Credential","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateCredentialRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateCredentialResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/status/{id}":{"get":{"description":"Get credential status list by id.","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Get Credential Status List","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetCredentialStatusListResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/verification":{"put":{"description":"Verify a given credential by its id. The system does the following levels of verification:\n1. Makes sure the credential has a valid signature\n2. Makes sure the credential has is not expired\n3. Makes sure the credential complies with the VC Data Model\n4. If the credential has a schema, makes sure its data complies with the schema","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Verify Credential","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.VerifyCredentialRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.VerifyCredentialResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/{id}":{"get":{"description":"Get credential by id","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Get Credential","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetCredentialResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"delete":{"description":"Delete credential by ID","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Delete Credentials","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/credentials/{id}/status":{"get":{"description":"Get credential status by id","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Get Credential Status","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetCredentialStatusResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Update a credential's status","consumes":["application/json"],"produces":["application/json"],"tags":["CredentialAPI"],"summary":"Update Credential Status","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.UpdateCredentialStatusRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.UpdateCredentialStatusResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/dids":{"get":{"description":"Get the list of supported DID methods","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"List DID Methods","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListDIDMethodsResponse"}}}}},"/v1/dids/resolver/{id}":{"get":{"description":"Resolve a DID that may not be stored in this service","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Resolve a DID","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ResolveDIDResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/dids/{method}":{"get":{"description":"List DIDs by method. Checks for an optional \"deleted=true\" query parameter, which exclusively returns DIDs that have been \"Soft Deleted\".","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"List DIDs","parameters":[{"type":"boolean","description":"When true, returns soft-deleted DIDs. Otherwise, returns DIDs that have not been soft-deleted. Default is false.","name":"deleted","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListDIDsByMethodResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Creates a fully custodial DID document with the given method. The document created is stored internally\nand can be retrieved using the GetOperation. Method dependent registration (for example, DID web\nregistration) is left up to the clients of this API. The private key(s) created by the method are stored\ninternally never leave the service boundary.","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Create DID Document","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateDIDByMethodRequest"}},{"type":"string","description":"Method","name":"method","in":"path","required":true}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateDIDByMethodResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/dids/{method}/{id}":{"get":{"description":"Get DID by method","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Get DID","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateDIDByMethodRequest"}},{"type":"string","description":"Method","name":"method","in":"path","required":true},{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetDIDByMethodResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"When this is called with the correct did method and id it will flip the softDelete flag to true for the db entry.\nA user can still get the did if they know the DID ID, and the did keys will still exist, but this did will not show up in the ListDIDsByMethod call\nThis facilitates a clean SSI-Service Admin UI but not leave any hanging VCs with inaccessible hanging DIDs.\nSoft Deletes DID by method","consumes":["application/json"],"produces":["application/json"],"tags":["DecentralizedIdentityAPI"],"summary":"Soft Delete DID","parameters":[{"type":"string","description":"Method","name":"method","in":"path","required":true},{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/issuancetemplates":{"put":{"description":"Create issuance template","consumes":["application/json"],"produces":["application/json"],"tags":["IssuanceAPI"],"summary":"Create issuance template","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateIssuanceTemplateRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/issuancetemplates/{id}":{"get":{"description":"Get an issuance template by its id","consumes":["application/json"],"produces":["application/json"],"tags":["IssuanceAPI"],"summary":"Get issuance template","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete issuance template by ID","consumes":["application/json"],"produces":["application/json"],"tags":["IssuanceAPI"],"summary":"Delete issuance template","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/keys":{"put":{"description":"Stores a key to be used by the service","consumes":["application/json"],"produces":["application/json"],"tags":["KeyStoreAPI"],"summary":"Store Key","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.StoreKeyRequest"}}],"responses":{"201":{"description":"Created"},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/keys/{id}":{"get":{"description":"Get details about a stored key","consumes":["application/json"],"produces":["application/json"],"tags":["KeyStoreAPI"],"summary":"Get Details For Key","parameters":[{"type":"string","description":"ID of the key to get","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetKeyDetailsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Marks the stored key as being revoked, along with the timestamps of when it was revoked. NB: the key can still be used for signing. This will likely be addressed before v1 is released.","consumes":["application/json"],"produces":["application/json"],"tags":["KeyStoreAPI"],"summary":"Revoke Key","parameters":[{"type":"string","description":"ID of the key to revoke","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.RevokeKeyResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests":{"get":{"description":"Checks for the presence of a query parameter and calls the associated filtered get method","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"List manifests","parameters":[{"type":"string","description":"string issuer","name":"issuer","in":"query"},{"type":"string","description":"string schema","name":"schema","in":"query"},{"type":"string","description":"string subject","name":"subject","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListManifestsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create manifest","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Create manifest","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateManifestRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateManifestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/applications":{"get":{"description":"List all the existing applications.","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"List applications","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListApplicationsResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Submit a credential application in response to a credential manifest. The request body is expected to","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Submit application","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.SubmitApplicationRequest"}}],"responses":{"201":{"description":"Operation with a SubmitApplicationResponse type in the ` + "`" + `result.response` + "`" + ` field.","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/applications/{id}":{"get":{"description":"Get application by id","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Get application","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetApplicationResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete application by ID","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Delete applications","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/applications/{id}/review":{"put":{"description":"Reviewing an application either fulfills or denies the credential.","consumes":["application/json"],"produces":["application/json"],"tags":["ApplicationAPI"],"summary":"Reviews an application","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.ReviewApplicationRequest"}}],"responses":{"201":{"description":"Credential Response","schema":{"$ref":"#/definitions/pkg_server_router.SubmitApplicationResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/requests":{"get":{"description":"Lists all the existing credential manifest requests","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"List Credential Manifest Requests","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListManifestRequestsResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create manifest request from an existing credential manifest.","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Create Manifest Request Request","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateManifestRequestRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateManifestRequestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/requests/{id}":{"get":{"description":"Get a manifest request by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Get Manifest Request","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetManifestRequestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a manifest request by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Delete Manifest Request","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/responses":{"get":{"description":"Lists all responses","consumes":["application/json"],"produces":["application/json"],"tags":["ResponseAPI"],"summary":"List responses","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListResponsesResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/responses/{id}":{"get":{"description":"Get response by id","consumes":["application/json"],"produces":["application/json"],"tags":["ResponseAPI"],"summary":"Get response","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetResponseResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"delete":{"description":"Delete response by ID","consumes":["application/json"],"produces":["application/json"],"tags":["ResponseAPI"],"summary":"Delete responses","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/manifests/{id}":{"get":{"description":"Get a credential manifest by its id","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Get manifest","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListManifestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete manifest by ID","consumes":["application/json"],"produces":["application/json"],"tags":["ManifestAPI"],"summary":"Delete manifests","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/operations":{"get":{"description":"List operations according to the request","consumes":["application/json"],"produces":["application/json"],"tags":["OperationAPI"],"summary":"List operations","parameters":[{"type":"string","description":"The name of the parent's resource. For example: ` + "`" + `?parent=/presentation/submissions` + "`" + `","name":"parent","in":"query"},{"type":"string","description":"A standard filter expression conforming to https://google.aip.dev/160. For example: ` + "`" + `?filter=done=","name":"filter","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListOperationsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/operations/cancel/{id}":{"get":{"description":"Cancels an ongoing operation, if possible.","consumes":["application/json"],"produces":["application/json"],"tags":["OperationAPI"],"summary":"Cancel an ongoing operation","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/operations/{id}":{"get":{"description":"Get operation by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["OperationAPI"],"summary":"Get an operation","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/definitions":{"get":{"description":"Lists all the existing presentation definitions","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"List Presentation Definitions","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListDefinitionsResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create presentation definition","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"Create PresentationDefinition","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreatePresentationDefinitionRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreatePresentationDefinitionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/definitions/{id}":{"get":{"description":"Get a presentation definition by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"Get PresentationDefinition","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetPresentationDefinitionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a presentation definition by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationDefinitionAPI"],"summary":"Delete PresentationDefinition","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/requests":{"put":{"description":"Create presentation request from an existing presentation definition.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationRequestAPI"],"summary":"Create Presentation Request","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateRequestRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateRequestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/requests/{id}":{"get":{"description":"Get a presentation request by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationRequestAPI"],"summary":"Get Presentation Request","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetRequestResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a presentation request by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationRequestAPI"],"summary":"Delete PresentationRequest","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/submissions":{"get":{"description":"List existing submissions according to a filtering query. The ` + "`" + `filter` + "`" + ` field follows the syntax described in https://google.aip.dev/160.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"List Submissions","parameters":[{"type":"string","description":"A standard filter expression conforming to https://google.aip.dev/160. For example: ` + "`" + `?filter=status=","name":"filter","in":"query"}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListSubmissionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Creates a submission in this server ready to be reviewed.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"Create Submission","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateSubmissionRequest"}}],"responses":{"201":{"description":"The type of response is Submission once the operation has finished.","schema":{"$ref":"#/definitions/pkg_server_router.Operation"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/presentations/submissions/{id}":{"get":{"description":"Get a submission by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"Get Submission","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetSubmissionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/presentations/submissions/{id}/review":{"put":{"description":"Reviews a pending submission. After this method is called, the operation with ` + "`" + `id==presentations/submissions/{submission_id}` + "`" + ` will be updated with the result of this invocation.","consumes":["application/json"],"produces":["application/json"],"tags":["PresentationSubmissionAPI"],"summary":"Review a pending submission","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.ReviewSubmissionRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ReviewSubmissionResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/schemas":{"get":{"description":"List schemas","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"List Schemas","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListSchemasResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create schema","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Create SchemaID","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateSchemaRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateSchemaResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/schemas/verification":{"put":{"description":"Verify a given schema by its id","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Verify SchemaID","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.VerifySchemaRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.VerifySchemaResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/schemas/{id}":{"get":{"description":"Get a schema by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Get SchemaID","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.GetSchemaResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}},"delete":{"description":"Delete a schema by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["SchemaAPI"],"summary":"Delete SchemaID","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/webhooks":{"get":{"description":"Lists all webhooks","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"List Webhooks","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListWebhooksResponse"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}},"put":{"description":"Create webhook","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Create Webhook","parameters":[{"description":"request body","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/pkg_server_router.CreateWebhookRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/pkg_server_router.CreateWebhookResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}},"/v1/webhooks/nouns":{"get":{"description":"Get supported nouns for webhook generation","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Get Supported Nouns","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedNounsResponse"}}}}},"/v1/webhooks/verbs":{"get":{"description":"Get supported verbs for webhook generation","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Get Supported Verbs","responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedVerbsResponse"}}}}},"/v1/webhooks/{noun}/{verb}":{"get":{"description":"Get a webhook by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Get Webhook","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/pkg_server_router.ListWebhookResponse"}},"400":{"description":"Bad request","schema":{"type":"string"}}}}},"/v1/webhooks/{noun}/{verb}/{url}":{"delete":{"description":"Delete a webhook by its ID","consumes":["application/json"],"produces":["application/json"],"tags":["WebhookAPI"],"summary":"Delete Webhook","parameters":[{"type":"string","description":"ID","name":"id","in":"path","required":true}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad request","schema":{"type":"string"}},"500":{"description":"Internal server error","schema":{"type":"string"}}}}}},"definitions":{"credential.CredentialSchema":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string"}}},"credential.CredentialSubject":{"type":"object","additionalProperties":{}},"credential.Prohibition":{"type":"object","properties":{"action":{"type":"array","items":{"type":"string"}},"assignee":{"type":"string"},"assigner":{"type":"string"},"target":{"type":"string"}}},"credential.RefreshService":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string"}}},"credential.TermsOfUse":{"type":"object","properties":{"id":{"type":"string"},"profile":{"type":"string"},"prohibition":{"type":"array","items":{"$ref":"#/definitions/credential.Prohibition"}},"type":{"type":"string"}}},"credential.VerifiableCredential":{"type":"object","required":["@context","credentialSubject","issuanceDate","issuer","type"],"properties":{"@context":{"description":"Either a string or set of strings"},"credentialSchema":{"$ref":"#/definitions/credential.CredentialSchema"},"credentialStatus":{},"credentialSubject":{"description":"This is where the subject's ID *may* be present","allOf":[{"$ref":"#/definitions/credential.CredentialSubject"}]},"evidence":{"type":"array","items":{}},"expirationDate":{"type":"string"},"id":{"type":"string"},"issuanceDate":{"description":"https://www.w3.org/TR/xmlschema11-2/#dateTimes","type":"string"},"issuer":{"description":"either a URI or an object containing an ` + "`" + `id` + "`" + ` property."},"proof":{"description":"For embedded proof support\nProof is a digital signature over a credential https://www.w3.org/TR/2021/REC-vc-data-model-20211109/#proofs-signatures"},"refreshService":{"$ref":"#/definitions/credential.RefreshService"},"termsOfUse":{"type":"array","items":{"$ref":"#/definitions/credential.TermsOfUse"}},"type":{"description":"Either a string or a set of strings https://www.w3.org/TR/2021/REC-vc-data-model-20211109/#types"}}},"credential.VerifiablePresentation":{"type":"object","required":["type"],"properties":{"@context":{"description":"Either a string or set of strings"},"holder":{"type":"string"},"id":{"type":"string"},"presentation_submission":{"description":"an optional field as a part of https://identity.foundation/presentation-exchange/#embed-targets"},"proof":{},"type":{},"verifiableCredential":{"description":"Verifiable credential could be our object model, a JWT, or any other valid credential representation","type":"array","items":{}}}},"crypto.KeyType":{"type":"string","enum":["Ed25519","X25519","secp256k1","secp256k1-ECDSA","P-224","P-256","P-384","P-521","RSA","Dilithium2","Dilithium3","Dilithium5"],"x-enum-varnames":["Ed25519","X25519","SECP256k1","SECP256k1ECDSA","P224","P256","P384","P521","RSA","Dilithium2","Dilithium3","Dilithium5"]},"crypto.SignatureAlgorithm":{"type":"string","enum":["EdDSA","ES256K","ES256","ES384","PS256","Dilithium2","Dilithium3","Dilithium5"],"x-enum-varnames":["EdDSA","ES256K","ES256","ES384","PS256","Dilithium2Sig","Dilithium3Sig","Dilithium5Sig"]},"did.Document":{"type":"object","properties":{"@context":{},"alsoKnownAs":{"type":"string"},"assertionMethod":{"type":"array","items":{}},"authentication":{"type":"array","items":{}},"capabilityDelegation":{"type":"array","items":{}},"capabilityInvocation":{"type":"array","items":{}},"controller":{"type":"string"},"id":{"description":"As per https://www.w3.org/TR/did-core/#did-subject intermediate representations of DID Documents do not\nrequire an ID property. The provided test vectors demonstrate IRs. As such, the property is optional.","type":"string"},"keyAgreement":{"type":"array","items":{}},"service":{"type":"array","items":{"$ref":"#/definitions/github_com_TBD54566975_ssi-sdk_did.Service"}},"verificationMethod":{"type":"array","items":{"$ref":"#/definitions/did.VerificationMethod"}}}},"did.Method":{"type":"string","enum":["key","peer","pkh","web","ion","jwk"],"x-enum-varnames":["KeyMethod","PeerMethod","PKHMethod","WebMethod","IONMethod","JWKMethod"]},"did.VerificationMethod":{"type":"object","required":["controller","id","type"],"properties":{"blockchainAccountId":{"description":"for PKH DIDs - https://github.com/w3c-ccg/did-pkh/blob/90b28ad3c18d63822a8aab3c752302aa64fc9382/did-pkh-method-draft.md","type":"string"},"controller":{"type":"string"},"id":{"type":"string"},"publicKeyBase58":{"type":"string"},"publicKeyJwk":{"description":"must conform to https://datatracker.ietf.org/doc/html/rfc7517","allOf":[{"$ref":"#/definitions/jwx.PublicKeyJWK"}]},"publicKeyMultibase":{"description":"https://datatracker.ietf.org/doc/html/draft-multiformats-multibase-03","type":"string"},"type":{"type":"string"}}},"exchange.ClaimFormat":{"type":"object","properties":{"jwt":{"$ref":"#/definitions/exchange.JWTType"},"jwt_vc":{"$ref":"#/definitions/exchange.JWTType"},"jwt_vp":{"$ref":"#/definitions/exchange.JWTType"},"ldp":{"$ref":"#/definitions/exchange.LDPType"},"ldp_vc":{"$ref":"#/definitions/exchange.LDPType"},"ldp_vp":{"$ref":"#/definitions/exchange.LDPType"}}},"exchange.Constraints":{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/definitions/exchange.Field"}},"is_holder":{"type":"array","items":{"$ref":"#/definitions/exchange.RelationalConstraint"}},"limit_disclosure":{"$ref":"#/definitions/exchange.Preference"},"same_subject":{"type":"array","items":{"$ref":"#/definitions/exchange.RelationalConstraint"}},"statuses":{"description":"https://identity.foundation/presentation-exchange/#credential-status-constraint-feature","allOf":[{"$ref":"#/definitions/exchange.CredentialStatus"}]},"subject_is_issuer":{"description":"https://identity.foundation/presentation-exchange/#relational-constraint-feature","allOf":[{"$ref":"#/definitions/exchange.Preference"}]}}},"exchange.CredentialStatus":{"type":"object","properties":{"active":{"type":"object","properties":{"directive":{"$ref":"#/definitions/exchange.Preference"}}},"revoked":{"type":"object","properties":{"directive":{"$ref":"#/definitions/exchange.Preference"}}},"suspended":{"type":"object","properties":{"directive":{"$ref":"#/definitions/exchange.Preference"}}}}},"exchange.Field":{"type":"object","required":["path"],"properties":{"filter":{"$ref":"#/definitions/exchange.Filter"},"id":{"type":"string"},"intent_to_retain":{"description":"https://identity.foundation/presentation-exchange/spec/v2.0.0/#retention-feature","type":"boolean"},"name":{"type":"string"},"optional":{"type":"boolean"},"path":{"type":"array","items":{"type":"string"}},"predicate":{"description":"If a predicate property is present, filter must be too\nhttps://identity.foundation/presentation-exchange/#predicate-feature","allOf":[{"$ref":"#/definitions/exchange.Preference"}]},"purpose":{"type":"string"}}},"exchange.Filter":{"type":"object","properties":{"additionalProperties":{"type":"boolean"},"allOf":{},"const":{},"enum":{"type":"array","items":{}},"exclusiveMaximum":{},"exclusiveMinimum":{},"format":{"type":"string"},"maxLength":{"type":"integer"},"maximum":{},"minLength":{"type":"integer"},"minimum":{},"not":{},"oneOf":{},"pattern":{"type":"string"},"properties":{},"required":{"type":"array","items":{"type":"string"}},"type":{"type":"string"}}},"exchange.InputDescriptor":{"type":"object","required":["constraints","id"],"properties":{"constraints":{"$ref":"#/definitions/exchange.Constraints"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"group":{"description":"Must match a grouping strings listed in the ` + "`" + `from` + "`" + ` values of a submission requirement rule","type":"array","items":{"type":"string"}},"id":{"description":"Must be unique within the Presentation Definition","type":"string"},"name":{"type":"string"},"purpose":{"description":"Purpose for which claim's data is being requested","type":"string"}}},"exchange.JWTType":{"type":"object","required":["alg"],"properties":{"alg":{"type":"array","items":{"$ref":"#/definitions/crypto.SignatureAlgorithm"}}}},"exchange.LDPType":{"type":"object","required":["proof_type"],"properties":{"proof_type":{"type":"array","items":{"type":"string"}}}},"exchange.Preference":{"type":"string","enum":["required","preferred","allowed","disallowed"],"x-enum-varnames":["Required","Preferred","Allowed","Disallowed"]},"exchange.PresentationDefinition":{"type":"object","required":["id","input_descriptors"],"properties":{"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"frame":{"description":"https://identity.foundation/presentation-exchange/#json-ld-framing-feature"},"id":{"type":"string"},"input_descriptors":{"type":"array","items":{"$ref":"#/definitions/exchange.InputDescriptor"}},"name":{"type":"string"},"purpose":{"type":"string"},"submission_requirements":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionRequirement"}}}},"exchange.PresentationSubmission":{"type":"object","required":["definition_id","descriptor_map","id"],"properties":{"definition_id":{"type":"string"},"descriptor_map":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionDescriptor"}},"id":{"type":"string"}}},"exchange.RelationalConstraint":{"type":"object","required":["directive","field_id"],"properties":{"directive":{"$ref":"#/definitions/exchange.Preference"},"field_id":{"type":"array","items":{"type":"string"}}}},"exchange.Selection":{"type":"string","enum":["all","pick"],"x-enum-varnames":["All","Pick"]},"exchange.SubmissionDescriptor":{"type":"object","required":["format","id","path"],"properties":{"format":{"type":"string"},"id":{"description":"Must match the ` + "`" + `id` + "`" + ` property of the corresponding input descriptor","type":"string"},"path":{"type":"string"},"path_nested":{"$ref":"#/definitions/exchange.SubmissionDescriptor"}}},"exchange.SubmissionRequirement":{"type":"object","required":["rule"],"properties":{"count":{"type":"integer","minimum":1},"from":{"type":"string"},"from_nested":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionRequirement"}},"max":{"type":"integer"},"min":{"type":"integer"},"name":{"type":"string"},"purpose":{"type":"string"},"rule":{"$ref":"#/definitions/exchange.Selection"}}},"github_com_TBD54566975_ssi-sdk_did.Service":{"type":"object","required":["id","serviceEndpoint","type"],"properties":{"accept":{"type":"array","items":{"type":"string"}},"id":{"type":"string"},"routingKeys":{"type":"array","items":{"type":"string"}},"serviceEndpoint":{"description":"A string, map, or set composed of one or more strings and/or maps\nAll string values must be valid URIs"},"type":{"type":"string"}}},"github_com_tbd54566975_ssi-service_internal_credential.Container":{"type":"object","properties":{"credential":{"$ref":"#/definitions/credential.VerifiableCredential"},"credentialJwt":{"type":"string"},"id":{"description":"Credential ID","type":"string"},"issuerKid":{"type":"string"},"revoked":{"type":"boolean"},"suspended":{"type":"boolean"}}},"github_com_tbd54566975_ssi-service_pkg_service_framework.Status":{"type":"object","properties":{"message":{"description":"When ` + "`" + `status` + "`" + ` is ` + "`" + `not_ready` + "`" + `, then message contains explanation of why it's not ready.","type":"string"},"status":{"description":"Either ` + "`" + `ready` + "`" + ` or ` + "`" + `not_ready` + "`" + `.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_framework.StatusState"}]}}},"github_com_tbd54566975_ssi-service_pkg_service_framework.StatusState":{"type":"string","enum":["ready","not_ready"],"x-enum-varnames":["StatusReady","StatusNotReady"]},"github_com_tbd54566975_ssi-service_pkg_service_issuance.ClaimTemplates":{"type":"object","additionalProperties":{}},"github_com_tbd54566975_ssi-service_pkg_service_issuance.CredentialTemplate":{"type":"object","properties":{"credentialInputDescriptor":{"description":"Optional.\nWhen present, it's the ID of the input descriptor in the application. Corresponds to one of the\nPresentationDefinition.InputDescriptors[].ID in the credential manifest. When creating a credential, the base\ndata will be populated from the provided submission that matches this ID.\nWhen absent, there will be no base data for the credentials created. Additionally, no JSON path strings in\nClaimTemplates.Data will be resolved.","type":"string"},"data":{"description":"Data that will be used to determine credential claims.\nValues may be json path like strings, or any other JSON primitive. Each entry will be used to come up with a\nclaim about the credentialSubject in the credential that will be issued.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.ClaimTemplates"}]},"expiry":{"description":"Parameter to determine the expiry of the credential.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.TimeLike"}]},"id":{"description":"ID corresponding to an OutputDescriptor.ID from the manifest.","type":"string"},"revocable":{"description":"Whether the credentials created should be revocable.","type":"boolean"},"schema":{"description":"ID of the CredentialSchema to be used for the issued credential.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_issuance.Template":{"type":"object","required":["credentialManifest","issuer","issuerKid"],"properties":{"credentialManifest":{"description":"ID of the credential manifest that this template corresponds to.","type":"string"},"credentials":{"description":"Info required to create a credential from a credential application.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.CredentialTemplate"}},"id":{"description":"ID of this template.","type":"string"},"issuer":{"description":"ID of the issuer that will be issuance the credentials.","type":"string"},"issuerKid":{"description":"ID of the key that will be used to sign the credentials.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_issuance.TimeLike":{"type":"object","properties":{"duration":{"description":"For a fixed offset from when it was issued.","allOf":[{"$ref":"#/definitions/time.Duration"}]},"time":{"description":"For fixed time in the future.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_manifest_model.CredentialOverride":{"type":"object","properties":{"data":{"description":"Data that will be used to determine credential claims.","type":"object","additionalProperties":{}},"expiry":{"description":"Parameter to determine the expiry of the credential.","type":"string"},"revocable":{"description":"Whether the credentials created should be revocable.","type":"boolean"}}},"github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request":{"type":"object","required":["expiration","issuerId","issuerKid","manifestId"],"properties":{"audience":{"description":"Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3.","type":"array","items":{"type":"string"}},"credentialManifestJwt":{"description":"CredentialManifestJWT is a JWT token with a \"presentation_definition\" claim within it. The\nvalue of the field named \"presentation_definition.id\" matches PresentationDefinitionID.\nThis is an output only field.","type":"string"},"expiration":{"description":"Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4","type":"string"},"id":{"description":"ID for this request. It matches the \"jti\" claim in the JWT.\nThis is an output only field.","type":"string"},"issuerId":{"description":"DID of the issuer of this presentation definition.","type":"string"},"issuerKid":{"description":"The privateKey associated with the KID used to sign the JWT.","type":"string"},"manifestId":{"description":"ID of the credential manifest used for this request.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request":{"type":"object","required":["expiration","issuerId","issuerKid","presentationDefinitionId"],"properties":{"audience":{"description":"Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3.","type":"array","items":{"type":"string"}},"expiration":{"description":"Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4","type":"string"},"id":{"description":"ID for this request. It matches the \"jti\" claim in the JWT.\nThis is an output only field.","type":"string"},"issuerId":{"description":"DID of the issuer of this presentation definition.","type":"string"},"issuerKid":{"description":"The privateKey associated with the KID used to sign the JWT.","type":"string"},"presentationDefinitionId":{"description":"ID of the presentation definition used for this request.","type":"string"},"presentationRequestJwt":{"description":"PresentationDefinitionJWT is a JWT token with a \"presentation_definition\" claim within it. The\nvalue of the field named \"presentation_definition.id\" matches PresentationDefinitionID.\nThis is an output only field.","type":"string"}}},"github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Submission":{"type":"object","required":["status"],"properties":{"reason":{"description":"The reason why the submission was approved or denied.","type":"string"},"status":{"description":"One of {` + "`" + `pending` + "`" + `, ` + "`" + `approved` + "`" + `, ` + "`" + `denied` + "`" + `, ` + "`" + `cancelled` + "`" + `}.","type":"string"},"verifiablePresentation":{"description":"The verifiable presentation containing the presentation_submission along with the credentials presented.","allOf":[{"$ref":"#/definitions/credential.VerifiablePresentation"}]}}},"github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedNounsResponse":{"type":"object","properties":{"nouns":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun"}}}},"github_com_tbd54566975_ssi-service_pkg_service_webhook.GetSupportedVerbsResponse":{"type":"object","properties":{"verbs":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb"}}}},"github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun":{"type":"string","enum":["Credential","DID","Manifest","SchemaID","Presentation","Application","Submission"],"x-enum-varnames":["Credential","DID","Manifest","Schema","Presentation","Application","Submission"]},"github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb":{"type":"string","enum":["Create","Delete"],"x-enum-varnames":["Create","Delete"]},"github_com_tbd54566975_ssi-service_pkg_service_webhook.Webhook":{"type":"object","required":["noun","urls","verb"],"properties":{"noun":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun"},"urls":{"type":"array","items":{"type":"string"}},"verb":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb"}}},"jwx.PublicKeyJWK":{"type":"object","required":["kty"],"properties":{"alg":{"type":"string"},"crv":{"type":"string"},"e":{"type":"string"},"key_ops":{"type":"string"},"kid":{"type":"string"},"kty":{"type":"string"},"n":{"type":"string"},"use":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"manifest.CredentialApplication":{"type":"object","required":["format","id","manifest_id","spec_version"],"properties":{"applicant":{"type":"string"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"id":{"type":"string"},"manifest_id":{"type":"string"},"presentation_submission":{"description":"Must be present if the corresponding manifest contains a presentation_definition","allOf":[{"$ref":"#/definitions/exchange.PresentationSubmission"}]},"spec_version":{"type":"string"}}},"manifest.CredentialManifest":{"type":"object","required":["id","issuer","output_descriptors","spec_version"],"properties":{"description":{"type":"string"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"id":{"type":"string"},"issuer":{"$ref":"#/definitions/manifest.Issuer"},"name":{"type":"string"},"output_descriptors":{"type":"array","items":{"$ref":"#/definitions/manifest.OutputDescriptor"}},"presentation_definition":{"$ref":"#/definitions/exchange.PresentationDefinition"},"spec_version":{"type":"string"}}},"manifest.CredentialResponse":{"type":"object","required":["id","manifest_id","spec_version"],"properties":{"applicant":{"type":"string"},"application_id":{"type":"string"},"denial":{"type":"object","required":["reason"],"properties":{"input_descriptors":{"type":"array","items":{"type":"string"}},"reason":{"type":"string"}}},"fulfillment":{"type":"object","required":["descriptor_map"],"properties":{"descriptor_map":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionDescriptor"}}}},"id":{"type":"string"},"manifest_id":{"type":"string"},"spec_version":{"type":"string"}}},"manifest.Issuer":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"styles":{"description":"an object or URI as defined by the DIF Entity Styles specification\nhttps://identity.foundation/wallet-rendering/#entity-styles","allOf":[{"$ref":"#/definitions/rendering.EntityStyleDescriptor"}]}}},"manifest.OutputDescriptor":{"type":"object","required":["id","schema"],"properties":{"description":{"type":"string"},"display":{"description":"both below: an object or URI as defined by the DIF Entity Styles specification","allOf":[{"$ref":"#/definitions/rendering.DataDisplay"}]},"id":{"description":"Must be unique within a manifest","type":"string"},"name":{"type":"string"},"schema":{"type":"string"},"styles":{"$ref":"#/definitions/rendering.EntityStyleDescriptor"}}},"pkg_server_router.CreateCredentialRequest":{"type":"object","required":["data","issuer","issuerKid","subject"],"properties":{"@context":{"description":"A context is optional. If not present, we'll apply default, required context values.","type":"string"},"data":{"description":"Claims about the subject. The keys should be predicates (e.g. \"alumniOf\"), and the values can be any object.","type":"object","additionalProperties":{"type":"string"},"example":{"alumniOf":"did_for_uni"}},"expiry":{"description":"Optional. Corresponds to ` + "`" + `expirationDate` + "`" + ` in https://www.w3.org/TR/vc-data-model/#expiration.","type":"string","example":"2020-01-01T19:23:24Z"},"issuer":{"description":"The issuer id.","type":"string","example":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp"},"issuerKid":{"description":"The KID used to sign the credential","type":"string","example":"#z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp"},"revocable":{"description":"Whether this credential can be revoked. When true, the created VC will have the \"credentialStatus\"\nproperty set.","type":"boolean"},"schemaId":{"description":"A schema ID is optional. If present, we'll attempt to look it up and validate the data against it.","type":"string"},"subject":{"description":"The subject id.","type":"string","example":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLVVQR3djdX3mDooWp"},"suspendable":{"description":"Whether this credential can be suspended. When true, the created VC will have the \"credentialStatus\"\nproperty set.","type":"boolean"}}},"pkg_server_router.CreateCredentialResponse":{"type":"object","properties":{"credential":{"description":"A verifiable credential conformant to the media type ` + "`" + `application/vc+ld+json` + "`" + `.","allOf":[{"$ref":"#/definitions/credential.VerifiableCredential"}]},"credentialJwt":{"description":"The same verifiable credential, but using the syntax defined for the media type ` + "`" + `application/vc+jwt` + "`" + `. See\nhttps://w3c.github.io/vc-jwt/ for more details.","type":"string"}}},"pkg_server_router.CreateDIDByMethodRequest":{"type":"object","required":["keyType"],"properties":{"keyType":{"description":"Identifies the cryptographic algorithm family to use when generating this key.\nOne of the following: \"Ed25519\", \"X25519\", \"secp256k1\", \"P-224\",\"P-256\",\"P-384\", \"P-521\", \"RSA\"","allOf":[{"$ref":"#/definitions/crypto.KeyType"}]},"options":{"description":"Options for creating the DID. Implementation dependent on the method."}}},"pkg_server_router.CreateDIDByMethodResponse":{"type":"object","properties":{"did":{"$ref":"#/definitions/did.Document"}}},"pkg_server_router.CreateIssuanceTemplateRequest":{"type":"object","required":["credentialManifest","issuer","issuerKid"],"properties":{"credentialManifest":{"description":"ID of the credential manifest that this template corresponds to.","type":"string"},"credentials":{"description":"Info required to create a credential from a credential application.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.CredentialTemplate"}},"id":{"description":"ID of this template.","type":"string"},"issuer":{"description":"ID of the issuer that will be issuance the credentials.","type":"string"},"issuerKid":{"description":"ID of the key that will be used to sign the credentials.","type":"string"}}},"pkg_server_router.CreateManifestRequest":{"type":"object","required":["format","issuerDid","issuerKid","outputDescriptors"],"properties":{"description":{"type":"string"},"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"issuerDid":{"type":"string"},"issuerKid":{"type":"string"},"issuerName":{"type":"string"},"name":{"type":"string"},"outputDescriptors":{"type":"array","items":{"$ref":"#/definitions/manifest.OutputDescriptor"}},"presentationDefinition":{"$ref":"#/definitions/exchange.PresentationDefinition"}}},"pkg_server_router.CreateManifestRequestRequest":{"type":"object","required":["credentialManifestId","issuerId","issuerKid"],"properties":{"audience":{"description":"Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3\nOptional","type":"array","items":{"type":"string"}},"credentialManifestId":{"description":"ID of the credential manifest to use for this request.","type":"string"},"expiration":{"description":"Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4\nOptional. When not specified, the request will be valid for a default duration.","type":"string"},"issuerId":{"description":"DID of the issuer of this presentation definition. The DID must have been previously created with the DID API,\nor the PrivateKey must have been added independently.","type":"string"},"issuerKid":{"description":"The privateKey associated with the KID will be used to sign an envelope that contains\nthe created presentation definition.","type":"string"}}},"pkg_server_router.CreateManifestRequestResponse":{"type":"object","properties":{"manifestRequest":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request"}}},"pkg_server_router.CreateManifestResponse":{"type":"object","properties":{"credential_manifest":{"$ref":"#/definitions/manifest.CredentialManifest"}}},"pkg_server_router.CreatePresentationDefinitionRequest":{"type":"object","required":["inputDescriptors"],"properties":{"format":{"$ref":"#/definitions/exchange.ClaimFormat"},"inputDescriptors":{"type":"array","items":{"$ref":"#/definitions/exchange.InputDescriptor"}},"name":{"type":"string"},"purpose":{"type":"string"},"submissionRequirements":{"type":"array","items":{"$ref":"#/definitions/exchange.SubmissionRequirement"}}}},"pkg_server_router.CreatePresentationDefinitionResponse":{"type":"object","properties":{"presentationDefinitionJwt":{"description":"Signed envelope that contains the PresentationDefinition created using the privateKey of the author of the\ndefinition.","type":"string"},"presentation_definition":{"$ref":"#/definitions/exchange.PresentationDefinition"}}},"pkg_server_router.CreateRequestRequest":{"type":"object","required":["issuerId","issuerKid","presentationDefinitionId"],"properties":{"audience":{"description":"Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3\nOptional","type":"array","items":{"type":"string"}},"expiration":{"description":"Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4\nOptional. When not specified, the request will be valid for a default duration.","type":"string"},"issuerId":{"description":"DID of the issuer of this presentation definition. The DID must have been previously created with the DID API,\nor the PrivateKey must have been added independently.","type":"string"},"issuerKid":{"description":"The privateKey associated with the KID will be used to sign an envelope that contains\nthe created presentation definition.","type":"string"},"presentationDefinitionId":{"description":"ID of the presentation definition to use for this request.","type":"string"}}},"pkg_server_router.CreateRequestResponse":{"type":"object","properties":{"presentationRequest":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request"}}},"pkg_server_router.CreateSchemaRequest":{"type":"object","required":["author","name","schema"],"properties":{"author":{"type":"string"},"authorKid":{"description":"AuthorKID represents the KID of the author's private key to sign the schema. Required if sign is true.","type":"string"},"name":{"type":"string"},"schema":{"$ref":"#/definitions/schema.JSONSchema"},"sign":{"description":"Sign represents whether the schema should be signed by the author. Default is false.\nIf sign is true, the schema will be signed by the author's private key with the specified KID","type":"boolean"}}},"pkg_server_router.CreateSchemaResponse":{"type":"object","properties":{"id":{"type":"string"},"schema":{"$ref":"#/definitions/schema.VCJSONSchema"},"schemaJwt":{"type":"string"}}},"pkg_server_router.CreateSubmissionRequest":{"type":"object","required":["submissionJwt"],"properties":{"submissionJwt":{"description":"A Verifiable Presentation that's encoded as a JWT.\nVerifiable Presentation are described in https://www.w3.org/TR/vc-data-model/#presentations-0\nJWT encoding of the Presentation as described in https://www.w3.org/TR/vc-data-model/#presentations-0","type":"string"}}},"pkg_server_router.CreateWebhookRequest":{"type":"object","required":["noun","url","verb"],"properties":{"noun":{"description":"The noun (entity) for the new webhook.eg: Credential","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Noun"}]},"url":{"description":"The URL to post the output of this request to Noun.Verb action to.","type":"string"},"verb":{"description":"The verb for the new webhook.eg: Create","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Verb"}]}}},"pkg_server_router.CreateWebhookResponse":{"type":"object","properties":{"webhook":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Webhook"}}},"pkg_server_router.GetApplicationResponse":{"type":"object","properties":{"application":{"$ref":"#/definitions/manifest.CredentialApplication"},"id":{"type":"string"}}},"pkg_server_router.GetCredentialResponse":{"type":"object","properties":{"credential":{"$ref":"#/definitions/credential.VerifiableCredential"},"credentialJwt":{"type":"string"},"id":{"type":"string"}}},"pkg_server_router.GetCredentialStatusListResponse":{"type":"object","properties":{"credential":{"description":"Credential where type includes \"VerifiableCredential\" and \"StatusList2021\".","allOf":[{"$ref":"#/definitions/credential.VerifiableCredential"}]},"credentialJwt":{"description":"The JWT signed with the associated issuer's private key.","type":"string"},"id":{"type":"string"}}},"pkg_server_router.GetCredentialStatusResponse":{"type":"object","properties":{"revoked":{"description":"Whether the credential has been revoked.","type":"boolean"},"suspended":{"description":"Whether the credential has been suspended.","type":"boolean"}}},"pkg_server_router.GetDIDByMethodResponse":{"type":"object","properties":{"did":{"$ref":"#/definitions/did.Document"}}},"pkg_server_router.GetHealthCheckResponse":{"type":"object","properties":{"status":{"description":"Status is always equal to ` + "`" + `OK` + "`" + `.","type":"string"}}},"pkg_server_router.GetKeyDetailsResponse":{"type":"object","properties":{"controller":{"type":"string"},"createdAt":{"description":"Represents the time at which the key was created. Encoded according to RFC3339.","type":"string"},"id":{"type":"string"},"publicKeyJwk":{"description":"The public key in JWK format according to RFC7517. This public key is associated with the private\nkey with the associated ID.","allOf":[{"$ref":"#/definitions/jwx.PublicKeyJWK"}]},"type":{"$ref":"#/definitions/crypto.KeyType"}}},"pkg_server_router.GetManifestRequestResponse":{"type":"object","properties":{"manifestRequest":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request"}}},"pkg_server_router.GetPresentationDefinitionResponse":{"type":"object","properties":{"presentation_definition":{"$ref":"#/definitions/exchange.PresentationDefinition"}}},"pkg_server_router.GetReadinessResponse":{"type":"object","properties":{"serviceStatuses":{"description":"A map from the name of the service ot the status of that current service.","type":"object","additionalProperties":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_framework.Status"}},"status":{"description":"Overall status of the ssi service.","allOf":[{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_framework.Status"}]}}},"pkg_server_router.GetRequestResponse":{"type":"object","properties":{"presentationRequest":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request"}}},"pkg_server_router.GetResponseResponse":{"type":"object","properties":{"credential_response":{"$ref":"#/definitions/manifest.CredentialResponse"},"responseJwt":{"type":"string"},"verifiableCredentials":{"description":"this is an interface type to union Data Integrity and JWT style VCs"}}},"pkg_server_router.GetSchemaResponse":{"type":"object","properties":{"schema":{"$ref":"#/definitions/schema.VCJSONSchema"},"schemaJwt":{"type":"string"}}},"pkg_server_router.GetSubmissionResponse":{"type":"object","required":["status"],"properties":{"reason":{"description":"The reason why the submission was approved or denied.","type":"string"},"status":{"description":"One of {` + "`" + `pending` + "`" + `, ` + "`" + `approved` + "`" + `, ` + "`" + `denied` + "`" + `, ` + "`" + `cancelled` + "`" + `}.","type":"string"},"verifiablePresentation":{"description":"The verifiable presentation containing the presentation_submission along with the credentials presented.","allOf":[{"$ref":"#/definitions/credential.VerifiablePresentation"}]}}},"pkg_server_router.ListApplicationsResponse":{"type":"object","properties":{"applications":{"type":"array","items":{"$ref":"#/definitions/manifest.CredentialApplication"}}}},"pkg_server_router.ListCredentialsResponse":{"type":"object","properties":{"credentials":{"description":"Array of credential containers.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_internal_credential.Container"}}}},"pkg_server_router.ListDIDMethodsResponse":{"type":"object","properties":{"method":{"type":"array","items":{"$ref":"#/definitions/did.Method"}}}},"pkg_server_router.ListDIDsByMethodResponse":{"type":"object","properties":{"dids":{"type":"array","items":{"$ref":"#/definitions/did.Document"}}}},"pkg_server_router.ListDefinitionsResponse":{"type":"object","properties":{"definitions":{"type":"array","items":{"$ref":"#/definitions/exchange.PresentationDefinition"}}}},"pkg_server_router.ListIssuanceTemplatesResponse":{"type":"object","properties":{"issuanceTemplates":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template"}}}},"pkg_server_router.ListManifestRequestsResponse":{"type":"object","properties":{"manifestRequests":{"description":"The manifest requests matching the query.","type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request"}}}},"pkg_server_router.ListManifestResponse":{"type":"object","properties":{"credential_manifest":{"$ref":"#/definitions/manifest.CredentialManifest"},"id":{"type":"string"}}},"pkg_server_router.ListManifestsResponse":{"type":"object","properties":{"manifests":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.ListManifestResponse"}}}},"pkg_server_router.ListOperationsResponse":{"type":"object","properties":{"operations":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.Operation"}}}},"pkg_server_router.ListResponsesResponse":{"type":"object","properties":{"responses":{"type":"array","items":{"$ref":"#/definitions/manifest.CredentialResponse"}}}},"pkg_server_router.ListSchemasResponse":{"type":"object","properties":{"schemas":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.GetSchemaResponse"}}}},"pkg_server_router.ListSubmissionResponse":{"type":"object","properties":{"submissions":{"type":"array","items":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Submission"}}}},"pkg_server_router.ListWebhookResponse":{"type":"object","properties":{"webhook":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_webhook.Webhook"}}},"pkg_server_router.ListWebhooksResponse":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/definitions/pkg_server_router.ListWebhookResponse"}}}},"pkg_server_router.Operation":{"type":"object","required":["done","id"],"properties":{"done":{"description":"Whether this operation has finished.","type":"boolean"},"id":{"description":"The name of the resource related to this operation. E.g. \"presentations/submissions/\u003cuuid\u003e\"","type":"string"},"result":{"description":"Populated if Done == true.","allOf":[{"$ref":"#/definitions/pkg_server_router.OperationResult"}]}}},"pkg_server_router.OperationResult":{"type":"object","properties":{"error":{"description":"Populated when there was an error with the operation.","type":"string"},"response":{"description":"Populated iff Error == \"\". The type should be specified in the calling APIs documentation."}}},"pkg_server_router.ResolveDIDResponse":{"type":"object","properties":{"didDocument":{"$ref":"#/definitions/did.Document"},"didDocumentMetadata":{"$ref":"#/definitions/resolution.DocumentMetadata"},"didResolutionMetadata":{"$ref":"#/definitions/resolution.ResolutionMetadata"}}},"pkg_server_router.ReviewApplicationRequest":{"type":"object","properties":{"approved":{"type":"boolean"},"credentialOverrides":{"description":"Overrides to apply to the credentials that will be created. Keys are the ID that corresponds to an\nOutputDescriptor.ID from the manifest.","type":"object","additionalProperties":{"$ref":"#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.CredentialOverride"}},"reason":{"type":"string"}}},"pkg_server_router.ReviewSubmissionRequest":{"type":"object","required":["approved"],"properties":{"approved":{"type":"boolean"},"reason":{"type":"string"}}},"pkg_server_router.ReviewSubmissionResponse":{"type":"object","required":["status"],"properties":{"reason":{"description":"The reason why the submission was approved or denied.","type":"string"},"status":{"description":"One of {` + "`" + `pending` + "`" + `, ` + "`" + `approved` + "`" + `, ` + "`" + `denied` + "`" + `, ` + "`" + `cancelled` + "`" + `}.","type":"string"},"verifiablePresentation":{"description":"The verifiable presentation containing the presentation_submission along with the credentials presented.","allOf":[{"$ref":"#/definitions/credential.VerifiablePresentation"}]}}},"pkg_server_router.RevokeKeyResponse":{"type":"object","properties":{"id":{"type":"string"}}},"pkg_server_router.StoreKeyRequest":{"type":"object","required":["base58PrivateKey","controller","id","type"],"properties":{"base58PrivateKey":{"description":"Base58 encoding of the bytes that result from marshalling the private key using golang's implementation.","type":"string"},"controller":{"description":"See https://www.w3.org/TR/did-core/#did-controller","type":"string"},"id":{"description":"The ` + "`" + `id` + "`" + ` field is the unique identifier for this object. If set to a resolvable DID, the ssi-service will use\nthe private key encoded in the ` + "`" + `PrivateKeyBase58` + "`" + ` field of this object to sign objects issued or authored by this\nDID; otherwise, it will only be used to identify this object.","type":"string"},"type":{"description":"Identifies the cryptographic algorithm family used with the key.\nOne of the following: \"Ed25519\", \"X25519\", \"secp256k1\", \"P-224\", \"P-256\", \"P-384\", \"P-521\", \"RSA\".","allOf":[{"$ref":"#/definitions/crypto.KeyType"}]}}},"pkg_server_router.SubmitApplicationRequest":{"type":"object","required":["applicationJwt"],"properties":{"applicationJwt":{"description":"Contains the following properties:\nApplication  manifestsdk.CredentialApplication ` + "`" + `json:\"credential_application\" validate:\"required\"` + "`" + `\nCredentials  []interface{}                     ` + "`" + `json:\"vcs\" validate:\"required\"` + "`" + `","type":"string"}}},"pkg_server_router.SubmitApplicationResponse":{"type":"object","properties":{"credential_response":{"$ref":"#/definitions/manifest.CredentialResponse"},"responseJwt":{"type":"string"},"verifiableCredentials":{"description":"this is an any type to union Data Integrity and JWT style VCs","type":"array","items":{}}}},"pkg_server_router.UpdateCredentialStatusRequest":{"type":"object","properties":{"revoked":{"description":"The new revoked status of this credential. The status will be saved in the encodedList of the StatusList2021\ncredential associated with this VC.","type":"boolean"},"suspended":{"type":"boolean"}}},"pkg_server_router.UpdateCredentialStatusResponse":{"type":"object","properties":{"revoked":{"description":"The updated status of this credential.","type":"boolean"},"suspended":{"type":"boolean"}}},"pkg_server_router.VerifyCredentialRequest":{"type":"object","properties":{"credential":{"description":"A credential secured via data integrity. Must have the \"proof\" property set.","allOf":[{"$ref":"#/definitions/credential.VerifiableCredential"}]},"credentialJwt":{"description":"A JWT that encodes a credential.","type":"string"}}},"pkg_server_router.VerifyCredentialResponse":{"type":"object","properties":{"reason":{"description":"The reason why this credential couldn't be verified.","type":"string"},"verified":{"description":"Whether the credential was verified.","type":"boolean"}}},"pkg_server_router.VerifySchemaRequest":{"type":"object","required":["schemaJwt"],"properties":{"schemaJwt":{"type":"string"}}},"pkg_server_router.VerifySchemaResponse":{"type":"object","required":["verified"],"properties":{"reason":{"type":"string"},"verified":{"type":"boolean"}}},"rendering.ColorResource":{"type":"object","properties":{"color":{"description":"a HEX string color value (e.g. #00000)","type":"string"}}},"rendering.DataDisplay":{"type":"object","properties":{"description":{"$ref":"#/definitions/rendering.DisplayMappingObject"},"properties":{"type":"array","items":{"$ref":"#/definitions/rendering.LabeledDisplayMappingObject"}},"subtitle":{"$ref":"#/definitions/rendering.DisplayMappingObject"},"title":{"$ref":"#/definitions/rendering.DisplayMappingObject"}}},"rendering.DisplayMappingObject":{"type":"object","properties":{"fallback":{"type":"string"},"path":{"description":"Ifa path is present it must be an array of JSON Path string expressions\nand the schema property must also be present.","type":"array","items":{"type":"string"}},"schema":{"$ref":"#/definitions/rendering.DisplayMappingSchema"},"text":{"description":"If path is not present, the text value is required with no other properties","type":"string"}}},"rendering.DisplayMappingSchema":{"type":"object","required":["type"],"properties":{"format":{"description":"Must be present if the value of the type property is \"string\"","allOf":[{"$ref":"#/definitions/rendering.SchemaFormat"}]},"type":{"$ref":"#/definitions/rendering.SchemaType"}}},"rendering.EntityStyleDescriptor":{"type":"object","properties":{"background":{"$ref":"#/definitions/rendering.ColorResource"},"hero":{"$ref":"#/definitions/rendering.ImageResource"},"text":{"$ref":"#/definitions/rendering.ColorResource"},"thumbnail":{"$ref":"#/definitions/rendering.ImageResource"}}},"rendering.ImageResource":{"type":"object","required":["uri"],"properties":{"alt":{"description":"Describes the alternate text for a logo image","type":"string"},"uri":{"description":"Must be a valid URI string to an image resource","type":"string"}}},"rendering.LabeledDisplayMappingObject":{"type":"object","required":["label"],"properties":{"fallback":{"type":"string"},"label":{"type":"string"},"path":{"description":"Ifa path is present it must be an array of JSON Path string expressions\nand the schema property must also be present.","type":"array","items":{"type":"string"}},"schema":{"$ref":"#/definitions/rendering.DisplayMappingSchema"},"text":{"description":"If path is not present, the text value is required with no other properties","type":"string"}}},"rendering.SchemaFormat":{"type":"string","enum":["date-time","time","date","email","idn-email","hostname","idn-hostname","ipv4","ipv6","uri","uri-reference","iri","iri-reference"],"x-enum-varnames":["DateTimeFormat","TimeFormat","DateFormat","EmailFormat","IDNEmailFormat","HostnameFormat","IDNHostnameFormat","IPV4Format","IPV6Format","URIFormat","URIReferenceFormat","IRIFormat","IRIReferenceFormat"]},"rendering.SchemaType":{"type":"string","enum":["string","boolean","number","integer"],"x-enum-varnames":["StringType","BooleanType","NumberType","IntegerType"]},"resolution.DocumentMetadata":{"type":"object","properties":{"canonicalId":{"type":"string"},"created":{"type":"string"},"deactivated":{"type":"boolean"},"equivalentId":{"type":"string"},"nextUpdate":{"type":"string"},"nextVersionId":{"type":"string"},"updated":{"type":"string"},"versionId":{"type":"string"}}},"resolution.ResolutionError":{"type":"object","properties":{"code":{"type":"string"},"invalidDid":{"type":"boolean"},"notFound":{"type":"boolean"},"representationNotSupported":{"type":"boolean"}}},"resolution.ResolutionMetadata":{"type":"object","properties":{"contentType":{"type":"string"},"error":{"$ref":"#/definitions/resolution.ResolutionError"}}},"schema.JSONSchema":{"type":"object","additionalProperties":{}},"schema.VCJSONSchema":{"type":"object","properties":{"author":{"type":"string"},"authored":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"schema":{"$ref":"#/definitions/schema.JSONSchema"},"type":{"type":"string"},"version":{"type":"string"}}},"time.Duration":{"type":"integer","enum":[-9223372036854775808,9223372036854775807,1,1000,1000000,1000000000,60000000000,3600000000000],"x-enum-varnames":["minDuration","maxDuration","Nanosecond","Microsecond","Millisecond","Second","Minute","Hour"]}}}`
 
 // SwaggerInfo holds exported Swagger Info so clients can modify it
 var SwaggerInfo = &swag.Spec{
diff --git a/doc/swagger.yaml b/doc/swagger.yaml
index ecc946c..3bd6ce2 100644
--- a/doc/swagger.yaml
+++ b/doc/swagger.yaml
@@ -646,6 +646,42 @@ definitions:
         description: Whether the credentials created should be revocable.
         type: boolean
     type: object
+  github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request:
+    properties:
+      audience:
+        description: Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3.
+        items:
+          type: string
+        type: array
+      credentialManifestJwt:
+        description: |-
+          CredentialManifestJWT is a JWT token with a "presentation_definition" claim within it. The
+          value of the field named "presentation_definition.id" matches PresentationDefinitionID.
+          This is an output only field.
+        type: string
+      expiration:
+        description: Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4
+        type: string
+      id:
+        description: |-
+          ID for this request. It matches the "jti" claim in the JWT.
+          This is an output only field.
+        type: string
+      issuerId:
+        description: DID of the issuer of this presentation definition.
+        type: string
+      issuerKid:
+        description: The privateKey associated with the KID used to sign the JWT.
+        type: string
+      manifestId:
+        description: ID of the credential manifest used for this request.
+        type: string
+    required:
+    - expiration
+    - issuerId
+    - issuerKid
+    - manifestId
+    type: object
   github_com_tbd54566975_ssi-service_pkg_service_presentation_model.Request:
     properties:
       audience:
@@ -1032,12 +1068,47 @@ definitions:
     - issuerKid
     - outputDescriptors
     type: object
+  pkg_server_router.CreateManifestRequestRequest:
+    properties:
+      audience:
+        description: |-
+          Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3
+          Optional
+        items:
+          type: string
+        type: array
+      credentialManifestId:
+        description: ID of the credential manifest to use for this request.
+        type: string
+      expiration:
+        description: |-
+          Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4
+          Optional. When not specified, the request will be valid for a default duration.
+        type: string
+      issuerId:
+        description: |-
+          DID of the issuer of this presentation definition. The DID must have been previously created with the DID API,
+          or the PrivateKey must have been added independently.
+        type: string
+      issuerKid:
+        description: |-
+          The privateKey associated with the KID will be used to sign an envelope that contains
+          the created presentation definition.
+        type: string
+    required:
+    - credentialManifestId
+    - issuerId
+    - issuerKid
+    type: object
+  pkg_server_router.CreateManifestRequestResponse:
+    properties:
+      manifestRequest:
+        $ref: '#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request'
+    type: object
   pkg_server_router.CreateManifestResponse:
     properties:
       credential_manifest:
         $ref: '#/definitions/manifest.CredentialManifest'
-      manifestJwt:
-        type: string
     type: object
   pkg_server_router.CreatePresentationDefinitionRequest:
     properties:
@@ -1238,6 +1309,11 @@ definitions:
       type:
         $ref: '#/definitions/crypto.KeyType'
     type: object
+  pkg_server_router.GetManifestRequestResponse:
+    properties:
+      manifestRequest:
+        $ref: '#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request'
+    type: object
   pkg_server_router.GetPresentationDefinitionResponse:
     properties:
       presentation_definition:
@@ -1337,14 +1413,20 @@ definitions:
           $ref: '#/definitions/github_com_tbd54566975_ssi-service_pkg_service_issuance.Template'
         type: array
     type: object
+  pkg_server_router.ListManifestRequestsResponse:
+    properties:
+      manifestRequests:
+        description: The manifest requests matching the query.
+        items:
+          $ref: '#/definitions/github_com_tbd54566975_ssi-service_pkg_service_manifest_model.Request'
+        type: array
+    type: object
   pkg_server_router.ListManifestResponse:
     properties:
       credential_manifest:
         $ref: '#/definitions/manifest.CredentialManifest'
       id:
         type: string
-      manifestJwt:
-        type: string
     type: object
   pkg_server_router.ListManifestsResponse:
     properties:
@@ -2673,6 +2755,107 @@ paths:
       summary: Reviews an application
       tags:
       - ApplicationAPI
+  /v1/manifests/requests:
+    get:
+      consumes:
+      - application/json
+      description: Lists all the existing credential manifest requests
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/pkg_server_router.ListManifestRequestsResponse'
+        "500":
+          description: Internal server error
+          schema:
+            type: string
+      summary: List Credential Manifest Requests
+      tags:
+      - ManifestAPI
+    put:
+      consumes:
+      - application/json
+      description: Create manifest request from an existing credential manifest.
+      parameters:
+      - description: request body
+        in: body
+        name: request
+        required: true
+        schema:
+          $ref: '#/definitions/pkg_server_router.CreateManifestRequestRequest'
+      produces:
+      - application/json
+      responses:
+        "201":
+          description: Created
+          schema:
+            $ref: '#/definitions/pkg_server_router.CreateManifestRequestResponse'
+        "400":
+          description: Bad request
+          schema:
+            type: string
+        "500":
+          description: Internal server error
+          schema:
+            type: string
+      summary: Create Manifest Request Request
+      tags:
+      - ManifestAPI
+  /v1/manifests/requests/{id}:
+    delete:
+      consumes:
+      - application/json
+      description: Delete a manifest request by its ID
+      parameters:
+      - description: ID
+        in: path
+        name: id
+        required: true
+        type: string
+      produces:
+      - application/json
+      responses:
+        "204":
+          description: No Content
+          schema:
+            type: string
+        "400":
+          description: Bad request
+          schema:
+            type: string
+        "500":
+          description: Internal server error
+          schema:
+            type: string
+      summary: Delete Manifest Request
+      tags:
+      - ManifestAPI
+    get:
+      consumes:
+      - application/json
+      description: Get a manifest request by its ID
+      parameters:
+      - description: ID
+        in: path
+        name: id
+        required: true
+        type: string
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/pkg_server_router.GetManifestRequestResponse'
+        "400":
+          description: Bad request
+          schema:
+            type: string
+      summary: Get Manifest Request
+      tags:
+      - ManifestAPI
   /v1/manifests/responses:
     get:
       consumes:
diff --git a/pkg/server/router/manifest.go b/pkg/server/router/manifest.go
index 8bdf8ec..6cd4af9 100644
--- a/pkg/server/router/manifest.go
+++ b/pkg/server/router/manifest.go
@@ -3,12 +3,13 @@ package router
 import (
 	"fmt"
 	"net/http"
+	"time"
 
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	manifestsdk "github.com/TBD54566975/ssi-sdk/credential/manifest"
 	"github.com/gin-gonic/gin"
 	"github.com/goccy/go-json"
-
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	"github.com/tbd54566975/ssi-service/pkg/service/manifest/model"
 
 	"github.com/tbd54566975/ssi-service/internal/credential"
@@ -35,7 +36,9 @@ func NewManifestRouter(s svcframework.Service) (*ManifestRouter, error) {
 	if !ok {
 		return nil, fmt.Errorf("could not create manifest router with service type: %s", s.Type())
 	}
-	return &ManifestRouter{service: manifestService}, nil
+	return &ManifestRouter{
+		service: manifestService,
+	}, nil
 }
 
 // CreateManifestRequest is the request body for creating a manifest, which populates all remaining fields
@@ -65,8 +68,7 @@ func (c CreateManifestRequest) ToServiceRequest() model.CreateManifestRequest {
 }
 
 type CreateManifestResponse struct {
-	Manifest    manifestsdk.CredentialManifest `json:"credential_manifest"`
-	ManifestJWT keyaccess.JWT                  `json:"manifestJwt"`
+	Manifest manifestsdk.CredentialManifest `json:"credential_manifest"`
 }
 
 // CreateManifest godoc
@@ -103,14 +105,13 @@ func (mr ManifestRouter) CreateManifest(c *gin.Context) {
 		return
 	}
 
-	resp := CreateManifestResponse{Manifest: createManifestResponse.Manifest, ManifestJWT: createManifestResponse.ManifestJWT}
+	resp := CreateManifestResponse{Manifest: createManifestResponse.Manifest}
 	framework.Respond(c, resp, http.StatusCreated)
 }
 
 type ListManifestResponse struct {
-	ID          string                         `json:"id"`
-	Manifest    manifestsdk.CredentialManifest `json:"credential_manifest"`
-	ManifestJWT keyaccess.JWT                  `json:"manifestJwt"`
+	ID       string                         `json:"id"`
+	Manifest manifestsdk.CredentialManifest `json:"credential_manifest"`
 }
 
 // GetManifest godoc
@@ -140,9 +141,8 @@ func (mr ManifestRouter) GetManifest(c *gin.Context) {
 	}
 
 	resp := ListManifestResponse{
-		ID:          gotManifest.Manifest.ID,
-		Manifest:    gotManifest.Manifest,
-		ManifestJWT: gotManifest.ManifestJWT,
+		ID:       gotManifest.Manifest.ID,
+		Manifest: gotManifest.Manifest,
 	}
 	framework.Respond(c, resp, http.StatusOK)
 }
@@ -176,9 +176,8 @@ func (mr ManifestRouter) ListManifests(c *gin.Context) {
 	manifests := make([]ListManifestResponse, 0, len(gotManifests.Manifests))
 	for _, m := range gotManifests.Manifests {
 		manifests = append(manifests, ListManifestResponse{
-			ID:          m.Manifest.ID,
-			Manifest:    m.Manifest,
-			ManifestJWT: m.ManifestJWT,
+			ID:       m.Manifest.ID,
+			Manifest: m.Manifest,
 		})
 	}
 
@@ -573,3 +572,173 @@ func (mr ManifestRouter) ReviewApplication(c *gin.Context) {
 		ResponseJWT: applicationResponse.ResponseJWT,
 	}, http.StatusCreated)
 }
+
+type CreateManifestRequestRequest struct {
+	*CommonCreateRequestRequest
+
+	// ID of the credential manifest to use for this request.
+	CredentialManifestID string `json:"credentialManifestId" validate:"required"`
+}
+
+type CreateManifestRequestResponse struct {
+	Request *model.Request `json:"manifestRequest"`
+}
+
+// CreateRequest godoc
+//
+//	@Summary		Create Manifest Request Request
+//	@Description	Create manifest request from an existing credential manifest.
+//	@Tags			ManifestAPI
+//	@Accept			json
+//	@Produce		json
+//	@Param			request	body		CreateManifestRequestRequest	true	"request body"
+//	@Success		201		{object}	CreateManifestRequestResponse
+//	@Failure		400		{string}	string	"Bad request"
+//	@Failure		500		{string}	string	"Internal server error"
+//	@Router			/v1/manifests/requests [put]
+func (mr ManifestRouter) CreateRequest(c *gin.Context) {
+	var request CreateManifestRequestRequest
+	errMsg := "Invalid Manifest Request Request"
+	if err := framework.Decode(c.Request, &request); err != nil {
+		framework.LoggingRespondErrWithMsg(c, err, errMsg, http.StatusBadRequest)
+		return
+	}
+	if err := framework.ValidateRequest(request); err != nil {
+		framework.LoggingRespondErrWithMsg(c, err, errMsg, http.StatusBadRequest)
+		return
+	}
+
+	req, err := mr.serviceRequestFromRequest(request)
+	if err != nil {
+		framework.LoggingRespondError(c, err, http.StatusBadRequest)
+		return
+	}
+
+	doc, err := mr.service.CreateRequest(c, model.CreateRequestRequest{ManifestRequest: *req})
+	if err != nil {
+		framework.LoggingRespondErrWithMsg(c, err, "signing and storing", http.StatusInternalServerError)
+		return
+	}
+	framework.Respond(c, CreateManifestRequestResponse{Request: doc}, http.StatusCreated)
+}
+
+func (mr ManifestRouter) serviceRequestFromRequest(request CreateManifestRequestRequest) (*model.Request, error) {
+	req, err := commonRequestToServiceRequest(request.CommonCreateRequestRequest, mr.service.Config().ExpirationDuration)
+	if err != nil {
+		return nil, err
+	}
+
+	return &model.Request{
+		Request:    *req,
+		ManifestID: request.CredentialManifestID,
+	}, nil
+}
+
+type ListManifestRequestsResponse struct {
+	// The manifest requests matching the query.
+	Requests []model.Request `json:"manifestRequests"`
+}
+
+// ListRequests godoc
+//
+//	@Summary		List Credential Manifest Requests
+//	@Description	Lists all the existing credential manifest requests
+//	@Tags			ManifestAPI
+//	@Accept			json
+//	@Produce		json
+//	@Success		200	{object}	ListManifestRequestsResponse
+//	@Failure		500	{string}	string	"Internal server error"
+//	@Router			/v1/manifests/requests [get]
+func (mr ManifestRouter) ListRequests(c *gin.Context) {
+	svcResponse, err := mr.service.ListRequests(c)
+
+	if err != nil {
+		errMsg := "could not get requests"
+		framework.LoggingRespondErrWithMsg(c, err, errMsg, http.StatusInternalServerError)
+		return
+	}
+	resp := ListManifestRequestsResponse{
+		Requests: svcResponse.ManifestRequests,
+	}
+	framework.Respond(c, resp, http.StatusOK)
+}
+
+type GetManifestRequestResponse struct {
+	Request *model.Request `json:"manifestRequest"`
+}
+
+// GetRequest godoc
+//
+//	@Summary		Get Manifest Request
+//	@Description	Get a manifest request by its ID
+//	@Tags			ManifestAPI
+//	@Accept			json
+//	@Produce		json
+//	@Param			id	path		string	true	"ID"
+//	@Success		200	{object}	GetManifestRequestResponse
+//	@Failure		400	{string}	string	"Bad request"
+//	@Router			/v1/manifests/requests/{id} [get]
+func (mr ManifestRouter) GetRequest(c *gin.Context) {
+	id := framework.GetParam(c, IDParam)
+	if id == nil {
+		framework.LoggingRespondErrMsg(c, "cannot get manifest request without an ID", http.StatusBadRequest)
+		return
+	}
+
+	request, err := mr.service.GetRequest(c, &model.GetRequestRequest{ID: *id})
+	if err != nil {
+		framework.LoggingRespondErrWithMsg(c, err, "getting manifest request", http.StatusInternalServerError)
+		return
+	}
+	framework.Respond(c, GetManifestRequestResponse{Request: request}, http.StatusOK)
+}
+
+// DeleteRequest godoc
+//
+//	@Summary		Delete Manifest Request
+//	@Description	Delete a manifest request by its ID
+//	@Tags			ManifestAPI
+//	@Accept			json
+//	@Produce		json
+//	@Param			id	path		string	true	"ID"
+//	@Success		204	{string}	string	"No Content"
+//	@Failure		400	{string}	string	"Bad request"
+//	@Failure		500	{string}	string	"Internal server error"
+//	@Router			/v1/manifests/requests/{id} [delete]
+func (mr ManifestRouter) DeleteRequest(c *gin.Context) {
+	id := framework.GetParam(c, IDParam)
+	if id == nil {
+		errMsg := "cannot delete a manifest request without an ID parameter"
+		framework.LoggingRespondErrMsg(c, errMsg, http.StatusBadRequest)
+		return
+	}
+
+	if err := mr.service.DeleteRequest(c, model.DeleteRequestRequest{ID: *id}); err != nil {
+		errMsg := fmt.Sprintf("could not delete manifest request with id: %s", *id)
+		framework.LoggingRespondErrWithMsg(c, err, errMsg, http.StatusInternalServerError)
+		return
+	}
+
+	framework.Respond(c, nil, http.StatusNoContent)
+}
+
+func commonRequestToServiceRequest(request *CommonCreateRequestRequest, expirationDuration time.Duration) (*common.Request, error) {
+	var expiration time.Time
+	var err error
+
+	if request.Expiration != "" {
+		expiration, err = time.Parse(time.RFC3339, request.Expiration)
+		if err != nil {
+			return nil, err
+		}
+	} else {
+		expiration = time.Now().Add(expirationDuration)
+	}
+	req := &common.Request{
+		Audience:   request.Audience,
+		Expiration: expiration,
+		IssuerDID:  request.IssuerDID,
+		IssuerKID:  request.IssuerKID,
+	}
+	return req, nil
+}
diff --git a/pkg/server/router/model.go b/pkg/server/router/model.go
new file mode 100644
index 0000000..2781979
--- /dev/null
+++ b/pkg/server/router/model.go
@@ -0,0 +1,19 @@
+package router
+
+type CommonCreateRequestRequest struct {
+	// Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3
+	// Optional
+	Audience []string `json:"audience"`
+
+	// Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4
+	// Optional. When not specified, the request will be valid for a default duration.
+	Expiration string `json:"expiration"`
+
+	// DID of the issuer of this presentation definition. The DID must have been previously created with the DID API,
+	// or the PrivateKey must have been added independently.
+	IssuerDID string `json:"issuerId" validate:"required"`
+
+	// The privateKey associated with the KID will be used to sign an envelope that contains
+	// the created presentation definition.
+	IssuerKID string `json:"issuerKid" validate:"required"`
+}
diff --git a/pkg/server/router/presentation.go b/pkg/server/router/presentation.go
index a6c72d8..bf93308 100644
--- a/pkg/server/router/presentation.go
+++ b/pkg/server/router/presentation.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"net/http"
 	"net/url"
-	"time"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
@@ -462,22 +461,7 @@ func (pr PresentationRouter) ReviewSubmission(c *gin.Context) {
 }
 
 type CreateRequestRequest struct {
-	// Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3
-	// Optional
-	Audience []string `json:"audience"`
-
-	// Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4
-	// Optional. When not specified, the request will be valid for a default duration.
-	Expiration string `json:"expiration"`
-
-	// DID of the issuer of this presentation definition. The DID must have been previously created with the DID API,
-	// or the PrivateKey must have been added independently.
-	IssuerDID string `json:"issuerId" validate:"required"`
-
-	// The privateKey associated with the KID will be used to sign an envelope that contains
-	// the created presentation definition.
-	IssuerKID string `json:"issuerKid" validate:"required"`
-
+	*CommonCreateRequestRequest
 	// ID of the presentation definition to use for this request.
 	PresentationDefinitionID string `json:"presentationDefinitionId" validate:"required"`
 }
@@ -529,23 +513,13 @@ func (pr PresentationRouter) CreateRequest(c *gin.Context) {
 }
 
 func (pr PresentationRouter) serviceRequestFromRequest(request CreateRequestRequest) (*model.Request, error) {
-	var expiration time.Time
-	var err error
-
-	if request.Expiration != "" {
-		expiration, err = time.Parse(time.RFC3339, request.Expiration)
-		if err != nil {
-			return nil, err
-		}
-	} else {
-		expiration = time.Now().Add(pr.service.Config().ExpirationDuration)
+	req, err := commonRequestToServiceRequest(request.CommonCreateRequestRequest, pr.service.Config().ExpirationDuration)
+	if err != nil {
+		return nil, err
 	}
 
 	return &model.Request{
-		Audience:                 request.Audience,
-		Expiration:               expiration,
-		IssuerDID:                request.IssuerDID,
-		IssuerKID:                request.IssuerKID,
+		Request:                  *req,
 		PresentationDefinitionID: request.PresentationDefinitionID,
 	}, nil
 }
diff --git a/pkg/server/server.go b/pkg/server/server.go
index 70f42b1..1fad8d7 100644
--- a/pkg/server/server.go
+++ b/pkg/server/server.go
@@ -274,6 +274,12 @@ func ManifestAPI(rg *gin.RouterGroup, service svcframework.Service, webhookServi
 	applicationAPI.DELETE("/:id", middleware.Webhook(webhookService, webhook.Application, webhook.Delete), manifestRouter.DeleteApplication)
 	applicationAPI.PUT("/:id/review", manifestRouter.ReviewApplication)
 
+	manifestReqAPI := manifestAPI.Group(RequestsPrefix)
+	manifestReqAPI.PUT("", manifestRouter.CreateRequest)
+	manifestReqAPI.GET("", manifestRouter.ListRequests)
+	manifestReqAPI.GET("/:id", manifestRouter.GetRequest)
+	manifestReqAPI.PUT("/:id", manifestRouter.DeleteRequest)
+
 	responseAPI := manifestAPI.Group(ResponsesPrefix)
 	responseAPI.GET("", manifestRouter.ListResponses)
 	responseAPI.GET("/:id", manifestRouter.GetResponse)
diff --git a/pkg/service/common/request.go b/pkg/service/common/request.go
new file mode 100644
index 0000000..6893636
--- /dev/null
+++ b/pkg/service/common/request.go
@@ -0,0 +1,77 @@
+package common
+
+import (
+	"context"
+	"time"
+
+	"github.com/google/uuid"
+	"github.com/lestrrat-go/jwx/v2/jwt"
+	"github.com/pkg/errors"
+	"github.com/tbd54566975/ssi-service/pkg/service/keystore"
+)
+
+type Request struct {
+	// ID for this request. It matches the "jti" claim in the JWT.
+	// This is an output only field.
+	ID string `json:"id,omitempty"`
+
+	// Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3.
+	Audience []string `json:"audience,omitempty"`
+
+	// Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4
+	Expiration time.Time `json:"expiration" validate:"required"`
+
+	// DID of the issuer of this presentation definition.
+	IssuerDID string `json:"issuerId" validate:"required"`
+
+	// The privateKey associated with the KID used to sign the JWT.
+	IssuerKID string `json:"issuerKid" validate:"required"`
+}
+
+// ToServiceModel converts a storage model to a service model.
+func ToServiceModel(stored *StoredRequest) (*Request, error) {
+	expiration, err := time.Parse(time.RFC3339, stored.Expiration)
+	if err != nil {
+		return nil, errors.Wrap(err, "parsing expiration time")
+	}
+
+	return &Request{
+		ID:         stored.ID,
+		Audience:   stored.Audience,
+		Expiration: expiration,
+		IssuerDID:  stored.IssuerDID,
+		IssuerKID:  stored.IssuerKID,
+	}, nil
+}
+
+// CreateStoredRequest creates a StoredRequest with the associated signed JWT populated. In addition to the fields
+// present in request, the JWT will also include a claim with claimName and claimValue.
+func CreateStoredRequest(ctx context.Context, keyStore *keystore.Service, claimName string, claimValue any, request Request, id string) (*StoredRequest, error) {
+	requestID := uuid.NewString()
+	token, err := jwt.NewBuilder().
+		Claim(claimName, claimValue).
+		Audience(request.Audience).
+		Expiration(request.Expiration).
+		Issuer(request.IssuerDID).
+		NotBefore(time.Now()).
+		JwtID(requestID).
+		Build()
+	if err != nil {
+		return nil, errors.Wrap(err, "building jwt")
+	}
+	signedToken, err := keyStore.Sign(ctx, request.IssuerKID, token)
+	if err != nil {
+		return nil, errors.Wrapf(err, "signing payload with KID %q", request.IssuerKID)
+	}
+
+	stored := &StoredRequest{
+		ID:          requestID,
+		Audience:    request.Audience,
+		Expiration:  request.Expiration.Format(time.RFC3339),
+		IssuerDID:   request.IssuerDID,
+		IssuerKID:   request.IssuerKID,
+		ReferenceID: id,
+		JWT:         signedToken.String(),
+	}
+	return stored, nil
+}
diff --git a/pkg/service/common/storage.go b/pkg/service/common/storage.go
new file mode 100644
index 0000000..1099893
--- /dev/null
+++ b/pkg/service/common/storage.go
@@ -0,0 +1,86 @@
+package common
+
+import (
+	"context"
+
+	"github.com/TBD54566975/ssi-sdk/util"
+	"github.com/goccy/go-json"
+	"github.com/pkg/errors"
+	"github.com/tbd54566975/ssi-service/pkg/storage"
+)
+
+type StoredRequest struct {
+	ID          string   `json:"id"`
+	Audience    []string `json:"audience"`
+	Expiration  string   `json:"expiration"`
+	IssuerDID   string   `json:"issuerId"`
+	IssuerKID   string   `json:"issuerKid"`
+	ReferenceID string   `json:"referenceId"`
+	JWT         string   `json:"jwt"`
+}
+
+type RequestStorage interface {
+	StoreRequest(context.Context, StoredRequest) error
+	GetRequest(context.Context, string) (*StoredRequest, error)
+	ListRequests(context.Context) ([]StoredRequest, error)
+	DeleteRequest(context.Context, string) error
+}
+
+type requestStorage struct {
+	db        storage.ServiceStorage
+	namespace string
+}
+
+func NewRequestStorage(db storage.ServiceStorage, namespace string) RequestStorage {
+	return &requestStorage{db: db, namespace: namespace}
+}
+
+func (s *requestStorage) StoreRequest(ctx context.Context, request StoredRequest) error {
+	id := request.ID
+	if id == "" {
+		return util.LoggingNewError("could not store presentation request without an ID")
+	}
+	jsonBytes, err := json.Marshal(request)
+	if err != nil {
+		return util.LoggingErrorMsgf(err, "could not store presentation request: %s", id)
+	}
+	return s.db.Write(ctx, s.namespace, id, jsonBytes)
+}
+
+func (s *requestStorage) GetRequest(ctx context.Context, id string) (*StoredRequest, error) {
+	jsonBytes, err := s.db.Read(ctx, s.namespace, id)
+	if err != nil {
+		return nil, util.LoggingErrorMsgf(err, "could not get request: %s", id)
+	}
+	if len(jsonBytes) == 0 {
+		return nil, util.LoggingNewErrorf("request not found with id: %s", id)
+	}
+	var stored StoredRequest
+	if err := json.Unmarshal(jsonBytes, &stored); err != nil {
+		return nil, util.LoggingErrorMsgf(err, "could not unmarshal stored request: %s", id)
+	}
+	return &stored, nil
+}
+
+func (s *requestStorage) DeleteRequest(ctx context.Context, id string) error {
+	if err := s.db.Delete(ctx, s.namespace, id); err != nil {
+		return util.LoggingNewErrorf("could not delete request: %s", id)
+	}
+	return nil
+}
+
+func (s *requestStorage) ListRequests(ctx context.Context) ([]StoredRequest, error) {
+	m, err := s.db.ReadAll(ctx, s.namespace)
+	if err != nil {
+		return nil, errors.Wrap(err, "reading all")
+	}
+	ts := make([]StoredRequest, len(m))
+	i := 0
+	for k, v := range m {
+		if err = json.Unmarshal(v, &ts[i]); err != nil {
+			return nil, errors.Wrapf(err, "unmarshalling request with key <%s>", k)
+		}
+		i++
+	}
+	return ts, nil
+}
diff --git a/pkg/service/manifest/manifest.go b/pkg/service/manifest/manifest.go
index 1bccc0f..9c2f391 100644
--- a/pkg/service/manifest/manifest.go
+++ b/pkg/service/manifest/manifest.go
@@ -11,27 +11,8 @@ import (
 
 	didint "github.com/tbd54566975/ssi-service/internal/did"
 	"github.com/tbd54566975/ssi-service/internal/keyaccess"
-	"github.com/tbd54566975/ssi-service/pkg/service/keystore"
 )
 
-func (s Service) signManifestJWT(ctx context.Context, keyID string, m CredentialManifestContainer) (*keyaccess.JWT, error) {
-	gotKey, err := s.keyStore.GetKey(ctx, keystore.GetKeyRequest{ID: keyID})
-	if err != nil {
-		return nil, sdkutil.LoggingErrorMsgf(err, "could not get key for signing manifest with key<%s>", keyID)
-	}
-	keyAccess, err := keyaccess.NewJWKKeyAccess(gotKey.Controller, gotKey.ID, gotKey.Key)
-	if err != nil {
-		return nil, sdkutil.LoggingErrorMsgf(err, "could not create key access for signing manifest with key<%s>", gotKey.ID)
-	}
-
-	// signing the manifest as a JWT
-	manifestToken, err := keyAccess.SignJSON(m)
-	if err != nil {
-		return nil, sdkutil.LoggingErrorMsgf(err, "could not sign manifest with key<%s>", gotKey.ID)
-	}
-	return manifestToken, nil
-}
-
 func (s Service) verifyManifestJWT(ctx context.Context, token keyaccess.JWT) (*manifest.CredentialManifest, error) {
 	// parse headers
 	headers, err := keyaccess.GetJWTHeaders([]byte(token))
diff --git a/pkg/service/manifest/model/model.go b/pkg/service/manifest/model/model.go
index 2cfa218..dd35e24 100644
--- a/pkg/service/manifest/model/model.go
+++ b/pkg/service/manifest/model/model.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	manifestsdk "github.com/TBD54566975/ssi-sdk/credential/manifest"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 
 	cred "github.com/tbd54566975/ssi-service/internal/credential"
 	"github.com/tbd54566975/ssi-service/internal/keyaccess"
@@ -14,19 +15,19 @@ import (
 // Manifest
 
 type CreateManifestRequest struct {
-	Name                   *string                          `json:"name,omitempty"`
-	Description            *string                          `json:"description,omitempty"`
-	IssuerDID              string                           `json:"issuerDid" validate:"required"`
-	IssuerKID              string                           `json:"issuerKid" validate:"required"`
-	IssuerName             *string                          `json:"issuerName,omitempty"`
-	OutputDescriptors      []manifestsdk.OutputDescriptor   `json:"outputDescriptors" validate:"required,dive"`
-	ClaimFormat            *exchange.ClaimFormat            `json:"format" validate:"required,dive"`
+	Name              *string                        `json:"name,omitempty"`
+	Description       *string                        `json:"description,omitempty"`
+	IssuerDID         string                         `json:"issuerDid" validate:"required"`
+	IssuerKID         string                         `json:"issuerKid" validate:"required"`
+	IssuerName        *string                        `json:"issuerName,omitempty"`
+	OutputDescriptors []manifestsdk.OutputDescriptor `json:"outputDescriptors" validate:"required,dive"`
+	ClaimFormat       *exchange.ClaimFormat          `json:"format" validate:"required,dive"`
+	// TODO: Allow for specifying the presentation definition only by id. https://github.com/TBD54566975/ssi-service/issues/491
 	PresentationDefinition *exchange.PresentationDefinition `json:"presentationDefinition,omitempty" validate:"omitempty,dive"`
 }
 
 type CreateManifestResponse struct {
-	Manifest    manifestsdk.CredentialManifest `json:"manifest"`
-	ManifestJWT keyaccess.JWT                  `json:"manifestJwt,omitempty"`
+	Manifest manifestsdk.CredentialManifest `json:"manifest"`
 }
 
 type VerifyManifestRequest struct {
@@ -44,8 +45,7 @@ type GetManifestRequest struct {
 }
 
 type GetManifestResponse struct {
-	Manifest    manifestsdk.CredentialManifest `json:"manifest"`
-	ManifestJWT keyaccess.JWT                  `json:"manifestJwt,omitempty"`
+	Manifest manifestsdk.CredentialManifest `json:"manifest"`
 }
 
 type ListManifestsResponse struct {
@@ -142,3 +142,40 @@ type CredentialOverride struct {
 	// Whether the credentials created should be revocable.
 	Revocable bool `json:"revocable"`
 }
+
+type CreateRequestRequest struct {
+	ManifestRequest Request `json:"manifestRequest"`
+}
+
+type CreateRequestResponse struct {
+	ManifestRequest Request `json:"manifestRequest"`
+}
+
+type GetRequestRequest struct {
+	ID string `json:"id" validate:"required"`
+}
+
+type GetRequestResponse struct {
+	ID              string  `json:"id"`
+	ManifestRequest Request `json:"manifestRequest"`
+}
+
+type DeleteRequestRequest struct {
+	ID string `json:"id" validate:"required"`
+}
+
+type ListRequestsResponse struct {
+	ManifestRequests []Request `json:"manifestRequests"`
+}
+
+type Request struct {
+	common.Request
+
+	// ID of the credential manifest used for this request.
+	ManifestID string `json:"manifestId" validate:"required"`
+
+	// CredentialManifestJWT is a JWT token with a "presentation_definition" claim within it. The
+	// value of the field named "presentation_definition.id" matches PresentationDefinitionID.
+	// This is an output only field.
+	CredentialManifestJWT keyaccess.JWT `json:"credentialManifestJwt"`
+}
diff --git a/pkg/service/manifest/service.go b/pkg/service/manifest/service.go
index a3397a6..7a043fc 100644
--- a/pkg/service/manifest/service.go
+++ b/pkg/service/manifest/service.go
@@ -12,9 +12,10 @@ import (
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
-
 	"github.com/tbd54566975/ssi-service/config"
 	credint "github.com/tbd54566975/ssi-service/internal/credential"
+	"github.com/tbd54566975/ssi-service/internal/keyaccess"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	"github.com/tbd54566975/ssi-service/pkg/service/credential"
 	"github.com/tbd54566975/ssi-service/pkg/service/framework"
 	"github.com/tbd54566975/ssi-service/pkg/service/issuance"
@@ -27,6 +28,8 @@ import (
 	"github.com/tbd54566975/ssi-service/pkg/storage"
 )
 
+const requestNamespace = "manifest_request"
+
 type Service struct {
 	storage                 *manifeststg.Storage
 	opsStorage              *operation.Storage
@@ -38,7 +41,8 @@ type Service struct {
 	didResolver resolution.Resolver
 	credential  *credential.Service
 
-	Clock clock.Clock
+	Clock      clock.Clock
+	reqStorage common.RequestStorage
 }
 
 func (s Service) Type() framework.Type {
@@ -86,6 +90,7 @@ func NewManifestService(config config.ManifestServiceConfig, s storage.ServiceSt
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsg(err, "could not instantiate storage for issuance templates")
 	}
+	requestStorage := common.NewRequestStorage(s, requestNamespace)
 	return &Service{
 		storage:                 manifestStorage,
 		opsStorage:              opsStorage,
@@ -95,6 +100,7 @@ func NewManifestService(config config.ManifestServiceConfig, s storage.ServiceSt
 		didResolver:             didResolver,
 		credential:              credential,
 		Clock:                   clock.New(),
+		reqStorage:              requestStorage,
 	}, nil
 }
 
@@ -165,19 +171,12 @@ func (s Service) CreateManifest(ctx context.Context, request model.CreateManifes
 		return nil, sdkutil.LoggingErrorMsg(err, "could not build manifest")
 	}
 
-	// sign the manifest
-	manifestJWT, err := s.signManifestJWT(ctx, request.IssuerKID, CredentialManifestContainer{Manifest: *m})
-	if err != nil {
-		return nil, sdkutil.LoggingErrorMsg(err, "could not sign manifest")
-	}
-
 	// store the manifest
 	storageRequest := manifeststg.StoredManifest{
-		ID:          m.ID,
-		IssuerDID:   m.Issuer.ID,
-		IssuerKID:   request.IssuerKID,
-		Manifest:    *m,
-		ManifestJWT: *manifestJWT,
+		ID:        m.ID,
+		IssuerDID: m.Issuer.ID,
+		IssuerKID: request.IssuerKID,
+		Manifest:  *m,
 	}
 
 	if err = s.storage.StoreManifest(ctx, storageRequest); err != nil {
@@ -185,7 +184,7 @@ func (s Service) CreateManifest(ctx context.Context, request model.CreateManifes
 	}
 
 	// return the result
-	response := model.CreateManifestResponse{Manifest: *m, ManifestJWT: *manifestJWT}
+	response := model.CreateManifestResponse{Manifest: *m}
 	return &response, nil
 }
 
@@ -214,7 +213,7 @@ func (s Service) GetManifest(ctx context.Context, request model.GetManifestReque
 		return nil, sdkutil.LoggingErrorMsgf(err, "could not get manifest: %s", request.ID)
 	}
 
-	response := model.GetManifestResponse{Manifest: gotManifest.Manifest, ManifestJWT: gotManifest.ManifestJWT}
+	response := model.GetManifestResponse{Manifest: gotManifest.Manifest}
 	return &response, nil
 }
 
@@ -227,7 +226,7 @@ func (s Service) ListManifests(ctx context.Context) (*model.ListManifestsRespons
 
 	manifests := make([]model.GetManifestResponse, 0, len(gotManifests))
 	for _, m := range gotManifests {
-		response := model.GetManifestResponse{Manifest: m.Manifest, ManifestJWT: m.ManifestJWT}
+		response := model.GetManifestResponse{Manifest: m.Manifest}
 		manifests = append(manifests, response)
 	}
 	response := model.ListManifestsResponse{Manifests: manifests}
@@ -528,3 +527,83 @@ func (s Service) DeleteResponse(ctx context.Context, request model.DeleteRespons
 
 	return nil
 }
+
+func (s Service) CreateRequest(ctx context.Context, req model.CreateRequestRequest) (*model.Request, error) {
+	if err := sdkutil.IsValidStruct(req); err != nil {
+		return nil, err
+	}
+
+	request := req.ManifestRequest
+	storedManifest, err := s.storage.GetManifest(ctx, request.ManifestID)
+	if err != nil {
+		return nil, errors.Wrap(err, "getting credential manifest")
+	}
+	if storedManifest == nil {
+		return nil, errors.Errorf("credential manifest %q is nil", request.ManifestID)
+	}
+
+	claimName := "credential_manifest"
+	claimValue := storedManifest.Manifest
+
+	stored, err := common.CreateStoredRequest(ctx, s.keyStore, claimName, claimValue, request.Request, request.ManifestID)
+	if err != nil {
+		return nil, errors.Wrap(err, "creating stored request")
+	}
+	if err := s.reqStorage.StoreRequest(ctx, *stored); err != nil {
+		return nil, errors.Wrap(err, "storing request")
+	}
+	return serviceModel(stored)
+}
+
+func (s Service) ListRequests(ctx context.Context) (*model.ListRequestsResponse, error) {
+	requests, err := s.reqStorage.ListRequests(ctx)
+	if err != nil {
+		return nil, errors.Wrap(err, "listing from storage")
+	}
+	reqs := make([]model.Request, 0, len(requests))
+	for _, storedReq := range requests {
+		storedReq := storedReq
+		r, err := serviceModel(&storedReq)
+		if err != nil {
+			return nil, err
+		}
+		reqs = append(reqs, *r)
+	}
+	return &model.ListRequestsResponse{ManifestRequests: reqs}, nil
+}
+
+func (s Service) GetRequest(ctx context.Context, request *model.GetRequestRequest) (*model.Request, error) {
+	logrus.Debugf("getting manifest request: %s", request.ID)
+
+	storedRequest, err := s.reqStorage.GetRequest(ctx, request.ID)
+	if err != nil {
+		return nil, errors.Wrapf(err, "getting signed document with id: %s", request.ID)
+	}
+	if storedRequest == nil {
+		return nil, sdkutil.LoggingNewErrorf("manifest request with id<%s> could not be found", request.ID)
+	}
+
+	return serviceModel(storedRequest)
+}
+
+func (s Service) DeleteRequest(ctx context.Context, request model.DeleteRequestRequest) error {
+	logrus.Debugf("deleting manifest request: %s", request.ID)
+
+	if err := s.reqStorage.DeleteRequest(ctx, request.ID); err != nil {
+		return sdkutil.LoggingNewErrorf("could not delete manifest request with id: %s", request.ID)
+	}
+
+	return nil
+}
+
+func serviceModel(stored *common.StoredRequest) (*model.Request, error) {
+	req, err := common.ToServiceModel(stored)
+	if err != nil {
+		return nil, err
+	}
+	return &model.Request{
+		Request:               *req,
+		ManifestID:            stored.ReferenceID,
+		CredentialManifestJWT: keyaccess.JWT(stored.JWT),
+	}, nil
+}
diff --git a/pkg/service/manifest/storage/storage.go b/pkg/service/manifest/storage/storage.go
index b4fc034..c5e7ae5 100644
--- a/pkg/service/manifest/storage/storage.go
+++ b/pkg/service/manifest/storage/storage.go
@@ -8,7 +8,6 @@ import (
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
-
 	cred "github.com/tbd54566975/ssi-service/internal/credential"
 	"github.com/tbd54566975/ssi-service/internal/keyaccess"
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/credential"
@@ -25,11 +24,10 @@ const (
 )
 
 type StoredManifest struct {
-	ID          string                      `json:"id"`
-	IssuerDID   string                      `json:"issuerDid"`
-	IssuerKID   string                      `json:"issuerKid"`
-	Manifest    manifest.CredentialManifest `json:"manifest"`
-	ManifestJWT keyaccess.JWT               `json:"manifestJwt"`
+	ID        string                      `json:"id"`
+	IssuerDID string                      `json:"issuerDid"`
+	IssuerKID string                      `json:"issuerKid"`
+	Manifest  manifest.CredentialManifest `json:"manifest"`
 }
 
 type StoredApplication struct {
diff --git a/pkg/service/presentation/model/model.go b/pkg/service/presentation/model/model.go
index 1ae0e3f..25e724d 100644
--- a/pkg/service/presentation/model/model.go
+++ b/pkg/service/presentation/model/model.go
@@ -1,12 +1,11 @@
 package model
 
 import (
-	"time"
-
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	"github.com/TBD54566975/ssi-sdk/util"
 	"github.com/goccy/go-json"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	"go.einride.tech/aip/filtering"
 
 	"github.com/tbd54566975/ssi-service/internal/credential"
@@ -144,21 +143,7 @@ type DeleteRequestRequest struct {
 }
 
 type Request struct {
-	// ID for this request. It matches the "jti" claim in the JWT.
-	// This is an output only field.
-	ID string `json:"id,omitempty"`
-
-	// Audience as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.3.
-	Audience []string `json:"audience,omitempty"`
-
-	// Expiration as defined in https://www.rfc-editor.org/rfc/rfc7519.html#section-4.1.4
-	Expiration time.Time `json:"expiration" validate:"required"`
-
-	// DID of the issuer of this presentation definition.
-	IssuerDID string `json:"issuerId" validate:"required"`
-
-	// The privateKey associated with the KID used to sign the JWT.
-	IssuerKID string `json:"issuerKid" validate:"required"`
+	common.Request
 
 	// ID of the presentation definition used for this request.
 	PresentationDefinitionID string `json:"presentationDefinitionId" validate:"required"`
diff --git a/pkg/service/presentation/service.go b/pkg/service/presentation/service.go
index f17293e..3d21088 100644
--- a/pkg/service/presentation/service.go
+++ b/pkg/service/presentation/service.go
@@ -3,21 +3,19 @@ package presentation
 import (
 	"context"
 	"fmt"
-	"time"
 
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
-	"github.com/google/uuid"
 	"github.com/lestrrat-go/jwx/jws"
-	"github.com/lestrrat-go/jwx/jwt"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 	"github.com/tbd54566975/ssi-service/config"
 	"github.com/tbd54566975/ssi-service/internal/credential"
 	didint "github.com/tbd54566975/ssi-service/internal/did"
 	"github.com/tbd54566975/ssi-service/internal/keyaccess"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	"github.com/tbd54566975/ssi-service/pkg/service/framework"
 	"github.com/tbd54566975/ssi-service/pkg/service/keystore"
 	"github.com/tbd54566975/ssi-service/pkg/service/operation"
@@ -310,39 +308,25 @@ func (s Service) CreateRequest(ctx context.Context, req model.CreateRequestReque
 		return nil, errors.Errorf("presentation definition %q is nil", request.PresentationDefinitionID)
 	}
 
-	requestID := uuid.NewString()
-	token, err := jwt.NewBuilder().Claim("presentation_definition", pd.PresentationDefinition).
-		Audience(request.Audience).
-		Expiration(request.Expiration).
-		Issuer(request.IssuerDID).
-		NotBefore(time.Now()).
-		JwtID(requestID).
-		Build()
+	stored, err := common.CreateStoredRequest(
+		ctx,
+		s.keystore,
+		"presentation_definition",
+		pd.PresentationDefinition,
+		request.Request,
+		request.PresentationDefinitionID,
+	)
 	if err != nil {
-		return nil, errors.Wrap(err, "building jwt")
+		return nil, errors.Wrap(err, "creating stored request")
 	}
-	signedToken, err := s.keystore.Sign(ctx, request.IssuerKID, token)
-	if err != nil {
-		return nil, errors.Wrapf(err, "signing payload with KID %q", request.IssuerKID)
-	}
-
-	stored := presentationstorage.StoredRequest{
-		ID:                        requestID,
-		Audience:                  request.Audience,
-		Expiration:                request.Expiration.Format(time.RFC3339),
-		IssuerDID:                 request.IssuerDID,
-		IssuerKID:                 request.IssuerKID,
-		PresentationDefinitionID:  request.PresentationDefinitionID,
-		PresentationDefinitionJWT: signedToken.String(),
-	}
-	if err := s.storage.StoreRequest(ctx, stored); err != nil {
+	if err := s.storage.StoreRequest(ctx, *stored); err != nil {
 		return nil, errors.Wrap(err, "storing signed document")
 	}
-	return serviceModel(&stored)
+	return serviceModel(stored)
 }
 
 func (s Service) GetRequest(ctx context.Context, request *model.GetRequestRequest) (*model.Request, error) {
-	logrus.Debugf("getting presentation definition: %s", request.ID)
+	logrus.Debugf("getting presentation request: %s", request.ID)
 
 	storedRequest, err := s.storage.GetRequest(ctx, request.ID)
 	if err != nil {
@@ -365,18 +349,14 @@ func (s Service) DeleteRequest(ctx context.Context, request model.DeleteRequestR
 	return nil
 }
 
-func serviceModel(storedRequest *presentationstorage.StoredRequest) (*model.Request, error) {
-	expiration, err := time.Parse(time.RFC3339, storedRequest.Expiration)
+func serviceModel(storedRequest *common.StoredRequest) (*model.Request, error) {
+	req, err := common.ToServiceModel(storedRequest)
 	if err != nil {
-		return nil, errors.Wrap(err, "parsing expiration time")
+		return nil, err
 	}
 	return &model.Request{
-		ID:                        storedRequest.ID,
-		Audience:                  storedRequest.Audience,
-		Expiration:                expiration,
-		IssuerDID:                 storedRequest.IssuerDID,
-		IssuerKID:                 storedRequest.IssuerKID,
-		PresentationDefinitionID:  storedRequest.PresentationDefinitionID,
-		PresentationDefinitionJWT: keyaccess.JWT(storedRequest.PresentationDefinitionJWT),
+		Request:                   *req,
+		PresentationDefinitionID:  storedRequest.ReferenceID,
+		PresentationDefinitionJWT: keyaccess.JWT(storedRequest.JWT),
 	}, nil
 }
diff --git a/pkg/service/presentation/storage.go b/pkg/service/presentation/storage.go
index 124a2aa..9ff475e 100644
--- a/pkg/service/presentation/storage.go
+++ b/pkg/service/presentation/storage.go
@@ -9,6 +9,7 @@ import (
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	"go.einride.tech/aip/filtering"
 
 	opstorage "github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
@@ -25,40 +26,7 @@ const (
 
 type Storage struct {
 	db storage.ServiceStorage
-}
-
-func (ps *Storage) StoreRequest(ctx context.Context, request prestorage.StoredRequest) error {
-	id := request.ID
-	if id == "" {
-		return sdkutil.LoggingNewError("could not store presentation request without an ID")
-	}
-	jsonBytes, err := json.Marshal(request)
-	if err != nil {
-		return sdkutil.LoggingErrorMsgf(err, "could not store presentation request: %s", id)
-	}
-	return ps.db.Write(ctx, presentationRequestNamespace, id, jsonBytes)
-}
-
-func (ps *Storage) GetRequest(ctx context.Context, id string) (*prestorage.StoredRequest, error) {
-	jsonBytes, err := ps.db.Read(ctx, presentationRequestNamespace, id)
-	if err != nil {
-		return nil, sdkutil.LoggingErrorMsgf(err, "could not get presentation request: %s", id)
-	}
-	if len(jsonBytes) == 0 {
-		return nil, sdkutil.LoggingNewErrorf("presentation request not found with id: %s", id)
-	}
-	var stored prestorage.StoredRequest
-	if err = json.Unmarshal(jsonBytes, &stored); err != nil {
-		return nil, sdkutil.LoggingErrorMsgf(err, "could not unmarshal stored presentation definition: %s", id)
-	}
-	return &stored, nil
-}
-
-func (ps *Storage) DeleteRequest(ctx context.Context, id string) error {
-	if err := ps.db.Delete(ctx, presentationRequestNamespace, id); err != nil {
-		return sdkutil.LoggingNewErrorf("could not delete presentation request: %s", id)
-	}
-	return nil
+	common.RequestStorage
 }
 
 func (ps *Storage) UpdateSubmission(ctx context.Context, id string, approved bool, reason string, opID string) (prestorage.StoredSubmission, opstorage.StoredOperation, error) {
@@ -129,7 +97,7 @@ func NewPresentationStorage(db storage.ServiceStorage) (prestorage.Storage, erro
 	if db == nil {
 		return nil, errors.New("bolt db reference is nil")
 	}
-	return &Storage{db: db}, nil
+	return &Storage{db: db, RequestStorage: common.NewRequestStorage(db, presentationRequestNamespace)}, nil
 }
 
 func (ps *Storage) StoreDefinition(ctx context.Context, presentation prestorage.StoredDefinition) error {
diff --git a/pkg/service/presentation/storage/storage.go b/pkg/service/presentation/storage/storage.go
index 8ac1c24..debfbd7 100644
--- a/pkg/service/presentation/storage/storage.go
+++ b/pkg/service/presentation/storage/storage.go
@@ -6,6 +6,7 @@ import (
 	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	"github.com/pkg/errors"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	opstorage "github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/submission"
 	"go.einride.tech/aip/filtering"
@@ -20,7 +21,7 @@ type StoredDefinition struct {
 
 type Storage interface {
 	DefinitionStorage
-	RequestStorage
+	common.RequestStorage
 	SubmissionStorage
 }
 
@@ -52,19 +53,3 @@ type SubmissionStorage interface {
 }
 
 var ErrSubmissionNotFound = errors.New("submission not found")
-
-type StoredRequest struct {
-	ID                        string   `json:"id"`
-	Audience                  []string `json:"audience"`
-	Expiration                string   `json:"expiration"`
-	IssuerDID                 string   `json:"issuerId"`
-	IssuerKID                 string   `json:"issuerKid"`
-	PresentationDefinitionID  string   `json:"presentationDefinitionId"`
-	PresentationDefinitionJWT string   `json:"presentationRequestJwt"`
-}
-
-type RequestStorage interface {
-	StoreRequest(context.Context, StoredRequest) error
-	GetRequest(context.Context, string) (*StoredRequest, error)
-	DeleteRequest(context.Context, string) error
-}


Test patch:
diff --git a/pkg/server/router/manifest_test.go b/pkg/server/router/manifest_test.go
index 90c59e0..d4f25ec 100644
--- a/pkg/server/router/manifest_test.go
+++ b/pkg/server/router/manifest_test.go
@@ -3,6 +3,7 @@ package router
 import (
 	"context"
 	"testing"
+	"time"
 
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	manifestsdk "github.com/TBD54566975/ssi-sdk/credential/manifest"
@@ -11,6 +12,7 @@ import (
 	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 
 	"github.com/tbd54566975/ssi-service/pkg/service/manifest/model"
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
@@ -104,7 +106,24 @@ func TestManifestRouter(t *testing.T) {
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, createdManifest)
 
-		verificationResponse, err := manifestService.VerifyManifest(context.Background(), model.VerifyManifestRequest{ManifestJWT: createdManifest.ManifestJWT})
+		manifestRequestRequest := getValidManifestRequestRequest(issuerDID, kid, createdManifest)
+		manifestRequest, err := manifestService.CreateRequest(context.Background(), manifestRequestRequest)
+		assert.NoError(tt, err)
+		assert.Equal(tt, createdManifest.Manifest.ID, manifestRequest.ManifestID)
+		assert.NotEmpty(tt, manifestRequest.CredentialManifestJWT.String())
+
+		got, err := manifestService.GetRequest(context.Background(), &model.GetRequestRequest{ID: manifestRequest.ID})
+		assert.NoError(t, err)
+		assert.Equal(t, manifestRequest, got)
+
+		err = manifestService.DeleteRequest(context.Background(), model.DeleteRequestRequest{ID: manifestRequest.ID})
+		assert.NoError(t, err)
+
+		_, err = manifestService.GetRequest(context.Background(), &model.GetRequestRequest{ID: manifestRequest.ID})
+		assert.Error(t, err)
+		assert.ErrorContains(t, err, "request not found")
+
+		verificationResponse, err := manifestService.VerifyManifest(context.Background(), model.VerifyManifestRequest{ManifestJWT: manifestRequest.CredentialManifestJWT})
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, verificationResponse)
 		assert.True(tt, verificationResponse.Verified)
@@ -146,6 +165,20 @@ func TestManifestRouter(t *testing.T) {
 	})
 }
 
+func getValidManifestRequestRequest(issuerDID *did.CreateDIDResponse, kid string, createdManifest *model.CreateManifestResponse) model.CreateRequestRequest {
+	return model.CreateRequestRequest{
+		ManifestRequest: model.Request{
+			Request: common.Request{
+				Audience:   []string{"mario"},
+				IssuerDID:  issuerDID.DID.ID,
+				IssuerKID:  kid,
+				Expiration: time.Now().Add(100 * time.Second),
+			},
+			ManifestID: createdManifest.Manifest.ID,
+		},
+	}
+}
+
 // getValidManifestRequest returns a valid manifest request, expecting a single JWT-VC EdDSA credential
 func getValidManifestRequest(issuerDID, issuerKID, schemaID string) model.CreateManifestRequest {
 	createManifestRequest := model.CreateManifestRequest{
diff --git a/pkg/server/router/presentation_test.go b/pkg/server/router/presentation_test.go
index e7b6f84..6b031a7 100644
--- a/pkg/server/router/presentation_test.go
+++ b/pkg/server/router/presentation_test.go
@@ -16,6 +16,7 @@ import (
 	"github.com/stretchr/testify/require"
 	"github.com/tbd54566975/ssi-service/config"
 	"github.com/tbd54566975/ssi-service/internal/keyaccess"
+	"github.com/tbd54566975/ssi-service/pkg/service/common"
 	"github.com/tbd54566975/ssi-service/pkg/service/did"
 	"github.com/tbd54566975/ssi-service/pkg/service/presentation"
 	"github.com/tbd54566975/ssi-service/pkg/service/presentation/model"
@@ -108,11 +109,13 @@ func TestPresentationDefinitionService(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		expectedReq := model.Request{
-			Audience:                 []string{"did:web:heman"},
-			IssuerDID:                authorDID.DID.ID,
-			IssuerKID:                authorDID.DID.VerificationMethod[0].ID,
+			Request: common.Request{
+				Audience:   []string{"did:web:heman"},
+				IssuerDID:  authorDID.DID.ID,
+				IssuerKID:  authorDID.DID.VerificationMethod[0].ID,
+				Expiration: time.Date(2023, 10, 10, 10, 10, 10, 0, time.UTC),
+			},
 			PresentationDefinitionID: pd.ID,
-			Expiration:               time.Date(2023, 10, 10, 10, 10, 10, 0, time.UTC),
 		}
 		req, err := service.CreateRequest(context.Background(), model.CreateRequestRequest{
 			PresentationRequest: expectedReq,
@@ -142,10 +145,12 @@ func TestPresentationDefinitionService(t *testing.T) {
 		assert.NoError(t, err)
 		req, err := service.CreateRequest(context.Background(), model.CreateRequestRequest{
 			PresentationRequest: model.Request{
-				Audience:                 []string{"did:web:heman"},
-				IssuerDID:                authorDID.DID.ID,
-				IssuerKID:                authorDID.DID.VerificationMethod[0].ID,
-				Expiration:               time.Now().Add(30 * time.Second),
+				Request: common.Request{
+					Audience:   []string{"did:web:heman"},
+					IssuerDID:  authorDID.DID.ID,
+					IssuerKID:  authorDID.DID.VerificationMethod[0].ID,
+					Expiration: time.Now().Add(30 * time.Second),
+				},
 				PresentationDefinitionID: pd.ID,
 			},
 		})
@@ -164,10 +169,12 @@ func TestPresentationDefinitionService(t *testing.T) {
 		assert.NoError(t, err)
 		req, err := service.CreateRequest(context.Background(), model.CreateRequestRequest{
 			PresentationRequest: model.Request{
-				IssuerDID:                authorDID.DID.ID,
-				IssuerKID:                authorDID.DID.VerificationMethod[0].ID,
+				Request: common.Request{
+					IssuerDID:  authorDID.DID.ID,
+					IssuerKID:  authorDID.DID.VerificationMethod[0].ID,
+					Expiration: time.Now().Add(30 * time.Second),
+				},
 				PresentationDefinitionID: pd.ID,
-				Expiration:               time.Now().Add(30 * time.Second),
 			},
 		})
 		assert.NoError(t, err)
@@ -177,14 +184,16 @@ func TestPresentationDefinitionService(t *testing.T) {
 
 		_, err = service.GetRequest(context.Background(), &model.GetRequestRequest{ID: req.ID})
 		assert.Error(t, err)
-		assert.ErrorContains(t, err, "presentation request not found")
+		assert.ErrorContains(t, err, "request not found")
 	})
 
 	t.Run("Error returned when missing required fields", func(t *testing.T) {
 		_, err := service.CreateRequest(context.Background(), model.CreateRequestRequest{
 			PresentationRequest: model.Request{
-				IssuerDID: "issuer id",
-				IssuerKID: "kid",
+				Request: common.Request{
+					IssuerDID: "issuer id",
+					IssuerKID: "kid",
+				},
 			},
 		})
 		assert.Error(t, err)
@@ -192,7 +201,9 @@ func TestPresentationDefinitionService(t *testing.T) {
 
 		_, err = service.CreateRequest(context.Background(), model.CreateRequestRequest{
 			PresentationRequest: model.Request{
-				IssuerDID:                "issuer id",
+				Request: common.Request{
+					IssuerDID: "issuer id",
+				},
 				PresentationDefinitionID: "something",
 			},
 		})
@@ -201,7 +212,9 @@ func TestPresentationDefinitionService(t *testing.T) {
 
 		_, err = service.CreateRequest(context.Background(), model.CreateRequestRequest{
 			PresentationRequest: model.Request{
-				IssuerKID:                "kid",
+				Request: common.Request{
+					IssuerKID: "kid",
+				},
 				PresentationDefinitionID: "something",
 			},
 		})
diff --git a/pkg/server/server_manifest_test.go b/pkg/server/server_manifest_test.go
index f2c987f..cc2293d 100644
--- a/pkg/server/server_manifest_test.go
+++ b/pkg/server/server_manifest_test.go
@@ -93,8 +93,21 @@ func TestManifestAPI(t *testing.T) {
 		assert.NotEmpty(tt, resp.Manifest)
 		assert.Equal(tt, resp.Manifest.Issuer.ID, issuerDID.DID.ID)
 
+		// create a credential manifest request
+		manifestRequestRequest := getValidManifestRequestRequest(issuerDID, kid, resp.Manifest)
+		requestValue = newRequestValue(tt, manifestRequestRequest)
+		req = httptest.NewRequest(http.MethodPut, "https://ssi-service.com/v1/manifests/requests", requestValue)
+		c = newRequestContext(w, req)
+		manifestRouter.CreateRequest(c)
+		assert.True(tt, util.Is2xxResponse(w.Code))
+
+		var reqResp router.CreateManifestRequestResponse
+		err = json.NewDecoder(w.Body).Decode(&reqResp)
+		assert.NoError(tt, err)
+		assert.NotEmpty(tt, reqResp.Request)
+
 		// verify the manifest
-		verificationResponse, err := manifestService.VerifyManifest(context.Background(), manifestsvc.VerifyManifestRequest{ManifestJWT: resp.ManifestJWT})
+		verificationResponse, err := manifestService.VerifyManifest(context.Background(), manifestsvc.VerifyManifestRequest{ManifestJWT: reqResp.Request.CredentialManifestJWT})
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, verificationResponse)
 		assert.True(tt, verificationResponse.Verified)
@@ -227,7 +240,7 @@ func TestManifestAPI(t *testing.T) {
 		err = json.NewDecoder(w.Body).Decode(&resp)
 		assert.NoError(tt, err)
 
-		// get manifest by id
+		// list all manifests
 		req = httptest.NewRequest(http.MethodGet, "https://ssi-service.com/v1/manifests", nil)
 		c = newRequestContext(w, req)
 		manifestRouter.ListManifests(c)
@@ -240,9 +253,36 @@ func TestManifestAPI(t *testing.T) {
 		assert.Len(tt, getManifestsResp.Manifests, 1)
 		assert.Equal(tt, resp.Manifest.ID, getManifestsResp.Manifests[0].ID)
 
-		// verify each manifest
-		for _, m := range getManifestsResp.Manifests {
-			verificationResponse, err := manifestService.VerifyManifest(context.Background(), manifestsvc.VerifyManifestRequest{ManifestJWT: m.ManifestJWT})
+		// create a credential manifest request
+		manifestRequestRequest := getValidManifestRequestRequest(issuerDID, kid, resp.Manifest)
+		requestValue = newRequestValue(tt, manifestRequestRequest)
+		w = httptest.NewRecorder()
+		req = httptest.NewRequest(http.MethodPut, "https://ssi-service.com/v1/manifests/requests", requestValue)
+		c = newRequestContext(w, req)
+		manifestRouter.CreateRequest(c)
+		assert.True(tt, util.Is2xxResponse(w.Code))
+
+		var reqResp router.CreateManifestRequestResponse
+		err = json.NewDecoder(w.Body).Decode(&reqResp)
+		assert.NoError(tt, err)
+		assert.NotEmpty(tt, reqResp.Request)
+
+		// list the manifest requests
+		req = httptest.NewRequest(http.MethodGet, "https://ssi-service.com/v1/manifests/requests", nil)
+		c = newRequestContext(w, req)
+		manifestRouter.ListRequests(c)
+		assert.True(tt, util.Is2xxResponse(w.Code))
+
+		var getManifestReqsResp router.ListManifestRequestsResponse
+		err = json.NewDecoder(w.Body).Decode(&getManifestReqsResp)
+		assert.NoError(tt, err)
+		assert.NotEmpty(tt, getManifestReqsResp)
+		assert.Len(tt, getManifestReqsResp.Requests, 1)
+		assert.Equal(tt, reqResp.Request.ID, getManifestReqsResp.Requests[0].ID)
+
+		// verify each manifest request
+		for _, m := range getManifestReqsResp.Requests {
+			verificationResponse, err := manifestService.VerifyManifest(context.Background(), manifestsvc.VerifyManifestRequest{ManifestJWT: m.CredentialManifestJWT})
 			assert.NoError(tt, err)
 			assert.NotEmpty(tt, verificationResponse)
 			assert.True(tt, verificationResponse.Verified)
@@ -1090,6 +1130,18 @@ func TestManifestAPI(t *testing.T) {
 	})
 }
 
+func getValidManifestRequestRequest(issuerDID *did.CreateDIDResponse, kid string, credentialManifest manifest.CredentialManifest) router.CreateManifestRequestRequest {
+	return router.CreateManifestRequestRequest{
+		CommonCreateRequestRequest: &router.CommonCreateRequestRequest{
+			Audience:   []string{"mario"},
+			IssuerDID:  issuerDID.DID.ID,
+			IssuerKID:  kid,
+			Expiration: "",
+		},
+		CredentialManifestID: credentialManifest.ID,
+	}
+}
+
 func getValidIssuanceTemplateRequest(m manifest.CredentialManifest, issuerDID *did.CreateDIDResponse,
 	createdSchema *schema.CreateSchemaResponse, expiry1 time.Time, expiry2 time.Duration) *issuance.CreateIssuanceTemplateRequest {
 	return &issuance.CreateIssuanceTemplateRequest{