diff --git a/api/api.gen.go b/api/api.gen.go index 9c550c487..a63624aa9 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -4970,6 +4970,11 @@ type ListCustomerAppDataParams struct { // UpsertCustomerAppDataJSONBody defines parameters for UpsertCustomerAppData. type UpsertCustomerAppDataJSONBody = []CustomerAppData +// GetCustomerEntitlementValueParams defines parameters for GetCustomerEntitlementValue. +type GetCustomerEntitlementValueParams struct { + Time *time.Time `form:"time,omitempty" json:"time,omitempty"` +} + // ListEntitlementsParams defines parameters for ListEntitlements. type ListEntitlementsParams struct { // Feature Filtering by multiple features. @@ -7929,6 +7934,9 @@ type ServerInterface interface { // Delete customer app data // (DELETE /api/v1/customers/{customerId}/apps/{appId}) DeleteCustomerAppData(w http.ResponseWriter, r *http.Request, customerId string, appId string) + // Get entitlement value + // (GET /api/v1/customers/{customerId}/entitlements/{featureKey}/value) + GetCustomerEntitlementValue(w http.ResponseWriter, r *http.Request, customerId string, featureKey string, params GetCustomerEntitlementValueParams) // Delete customer // (DELETE /api/v1/customers/{id}) DeleteCustomer(w http.ResponseWriter, r *http.Request, id string) @@ -8346,6 +8354,12 @@ func (_ Unimplemented) DeleteCustomerAppData(w http.ResponseWriter, r *http.Requ w.WriteHeader(http.StatusNotImplemented) } +// Get entitlement value +// (GET /api/v1/customers/{customerId}/entitlements/{featureKey}/value) +func (_ Unimplemented) GetCustomerEntitlementValue(w http.ResponseWriter, r *http.Request, customerId string, featureKey string, params GetCustomerEntitlementValueParams) { + w.WriteHeader(http.StatusNotImplemented) +} + // Delete customer // (DELETE /api/v1/customers/{id}) func (_ Unimplemented) DeleteCustomer(w http.ResponseWriter, r *http.Request, id string) { @@ -9963,6 +9977,51 @@ func (siw *ServerInterfaceWrapper) DeleteCustomerAppData(w http.ResponseWriter, handler.ServeHTTP(w, r) } +// GetCustomerEntitlementValue operation middleware +func (siw *ServerInterfaceWrapper) GetCustomerEntitlementValue(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "customerId" ------------- + var customerId string + + err = runtime.BindStyledParameterWithOptions("simple", "customerId", chi.URLParam(r, "customerId"), &customerId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "customerId", Err: err}) + return + } + + // ------------- Path parameter "featureKey" ------------- + var featureKey string + + err = runtime.BindStyledParameterWithOptions("simple", "featureKey", chi.URLParam(r, "featureKey"), &featureKey, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "featureKey", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetCustomerEntitlementValueParams + + // ------------- Optional query parameter "time" ------------- + + err = runtime.BindQueryParameter("form", true, false, "time", r.URL.Query(), ¶ms.Time) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "time", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetCustomerEntitlementValue(w, r, customerId, featureKey, params) + })) + + for i := len(siw.HandlerMiddlewares) - 1; i >= 0; i-- { + handler = siw.HandlerMiddlewares[i](handler) + } + + handler.ServeHTTP(w, r) +} + // DeleteCustomer operation middleware func (siw *ServerInterfaceWrapper) DeleteCustomer(w http.ResponseWriter, r *http.Request) { @@ -12560,6 +12619,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Delete(options.BaseURL+"/api/v1/customers/{customerId}/apps/{appId}", wrapper.DeleteCustomerAppData) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/api/v1/customers/{customerId}/entitlements/{featureKey}/value", wrapper.GetCustomerEntitlementValue) + }) r.Group(func(r chi.Router) { r.Delete(options.BaseURL+"/api/v1/customers/{id}", wrapper.DeleteCustomer) }) @@ -12768,762 +12830,767 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/client/go/client.gen.go b/api/client/go/client.gen.go index 7fa41fa22..6c499c233 100644 --- a/api/client/go/client.gen.go +++ b/api/client/go/client.gen.go @@ -4992,6 +4992,11 @@ type ListCustomerAppDataParams struct { // UpsertCustomerAppDataJSONBody defines parameters for UpsertCustomerAppData. type UpsertCustomerAppDataJSONBody = []CustomerAppData +// GetCustomerEntitlementValueParams defines parameters for GetCustomerEntitlementValue. +type GetCustomerEntitlementValueParams struct { + Time *time.Time `form:"time,omitempty" json:"time,omitempty"` +} + // ListEntitlementsParams defines parameters for ListEntitlements. type ListEntitlementsParams struct { // Feature Filtering by multiple features. @@ -8071,6 +8076,9 @@ type ClientInterface interface { // DeleteCustomerAppData request DeleteCustomerAppData(ctx context.Context, customerId string, appId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetCustomerEntitlementValue request + GetCustomerEntitlementValue(ctx context.Context, customerId string, featureKey string, params *GetCustomerEntitlementValueParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteCustomer request DeleteCustomer(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -8936,6 +8944,18 @@ func (c *Client) DeleteCustomerAppData(ctx context.Context, customerId string, a return c.Client.Do(req) } +func (c *Client) GetCustomerEntitlementValue(ctx context.Context, customerId string, featureKey string, params *GetCustomerEntitlementValueParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetCustomerEntitlementValueRequest(c.Server, customerId, featureKey, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) DeleteCustomer(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewDeleteCustomerRequest(c.Server, id) if err != nil { @@ -12253,6 +12273,69 @@ func NewDeleteCustomerAppDataRequest(server string, customerId string, appId str return req, nil } +// NewGetCustomerEntitlementValueRequest generates requests for GetCustomerEntitlementValue +func NewGetCustomerEntitlementValueRequest(server string, customerId string, featureKey string, params *GetCustomerEntitlementValueParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "customerId", runtime.ParamLocationPath, customerId) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "featureKey", runtime.ParamLocationPath, featureKey) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/v1/customers/%s/entitlements/%s/value", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Time != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "time", runtime.ParamLocationQuery, *params.Time); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewDeleteCustomerRequest generates requests for DeleteCustomer func NewDeleteCustomerRequest(server string, id string) (*http.Request, error) { var err error @@ -16844,6 +16927,9 @@ type ClientWithResponsesInterface interface { // DeleteCustomerAppDataWithResponse request DeleteCustomerAppDataWithResponse(ctx context.Context, customerId string, appId string, reqEditors ...RequestEditorFn) (*DeleteCustomerAppDataResponse, error) + // GetCustomerEntitlementValueWithResponse request + GetCustomerEntitlementValueWithResponse(ctx context.Context, customerId string, featureKey string, params *GetCustomerEntitlementValueParams, reqEditors ...RequestEditorFn) (*GetCustomerEntitlementValueResponse, error) + // DeleteCustomerWithResponse request DeleteCustomerWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*DeleteCustomerResponse, error) @@ -18121,6 +18207,35 @@ func (r DeleteCustomerAppDataResponse) StatusCode() int { return 0 } +type GetCustomerEntitlementValueResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *EntitlementValue + ApplicationproblemJSON400 *BadRequestProblemResponse + ApplicationproblemJSON401 *UnauthorizedProblemResponse + ApplicationproblemJSON403 *ForbiddenProblemResponse + ApplicationproblemJSON404 *NotFoundProblemResponse + ApplicationproblemJSON500 *InternalServerErrorProblemResponse + ApplicationproblemJSON503 *ServiceUnavailableProblemResponse + ApplicationproblemJSONDefault *UnexpectedProblemResponse +} + +// Status returns HTTPResponse.Status +func (r GetCustomerEntitlementValueResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetCustomerEntitlementValueResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type DeleteCustomerResponse struct { Body []byte HTTPResponse *http.Response @@ -20656,6 +20771,15 @@ func (c *ClientWithResponses) DeleteCustomerAppDataWithResponse(ctx context.Cont return ParseDeleteCustomerAppDataResponse(rsp) } +// GetCustomerEntitlementValueWithResponse request returning *GetCustomerEntitlementValueResponse +func (c *ClientWithResponses) GetCustomerEntitlementValueWithResponse(ctx context.Context, customerId string, featureKey string, params *GetCustomerEntitlementValueParams, reqEditors ...RequestEditorFn) (*GetCustomerEntitlementValueResponse, error) { + rsp, err := c.GetCustomerEntitlementValue(ctx, customerId, featureKey, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetCustomerEntitlementValueResponse(rsp) +} + // DeleteCustomerWithResponse request returning *DeleteCustomerResponse func (c *ClientWithResponses) DeleteCustomerWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*DeleteCustomerResponse, error) { rsp, err := c.DeleteCustomer(ctx, id, reqEditors...) @@ -24046,6 +24170,81 @@ func ParseDeleteCustomerAppDataResponse(rsp *http.Response) (*DeleteCustomerAppD return response, nil } +// ParseGetCustomerEntitlementValueResponse parses an HTTP response from a GetCustomerEntitlementValueWithResponse call +func ParseGetCustomerEntitlementValueResponse(rsp *http.Response) (*GetCustomerEntitlementValueResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetCustomerEntitlementValueResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest EntitlementValue + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest BadRequestProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: + var dest UnauthorizedProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSON401 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest ForbiddenProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSON403 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest NotFoundProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSON404 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: + var dest InternalServerErrorProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSON500 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 503: + var dest ServiceUnavailableProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSON503 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest UnexpectedProblemResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationproblemJSONDefault = &dest + + } + + return response, nil +} + // ParseDeleteCustomerResponse parses an HTTP response from a DeleteCustomerWithResponse call func ParseDeleteCustomerResponse(rsp *http.Response) (*DeleteCustomerResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -29735,358 +29934,363 @@ var swaggerSpec = []string{ "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", + "BwAA///CTXvHX5MHAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/openapi.cloud.yaml b/api/openapi.cloud.yaml index da63f5f27..15f750be2 100644 --- a/api/openapi.cloud.yaml +++ b/api/openapi.cloud.yaml @@ -101,8 +101,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -164,8 +164,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -233,8 +233,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -293,8 +293,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -353,8 +353,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -427,9 +427,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH explode: false - $ref: '#/components/parameters/Pagination.page' - $ref: '#/components/parameters/Pagination.pageSize' @@ -493,8 +493,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -570,8 +570,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -633,8 +633,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -698,8 +698,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -963,8 +963,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: expand in: query required: false @@ -1046,8 +1046,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1108,8 +1108,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1183,8 +1183,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1254,8 +1254,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1318,15 +1318,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: lineId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1388,15 +1388,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: lineId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1454,15 +1454,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: lineId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1534,8 +1534,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1601,8 +1601,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1670,8 +1670,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1872,8 +1872,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1931,8 +1931,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: expand in: query required: false @@ -2002,8 +2002,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2188,8 +2188,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - $ref: '#/components/parameters/PaginatedQuery.page' - $ref: '#/components/parameters/PaginatedQuery.pageSize' - $ref: '#/components/parameters/queryCustomerList.type' @@ -2254,8 +2254,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2328,15 +2328,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: appId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -2384,6 +2384,80 @@ paths: $ref: '#/components/schemas/UnexpectedProblemResponse' tags: - Customers (Private Preview) + /api/v1/customers/{customerId}/entitlements/{featureKey}/value: + get: + operationId: getCustomerEntitlementValue + summary: Get entitlement value + description: Checks customer access to a given feature (by key). All entitlement types share the hasAccess property in their value response, but multiple other properties are returned based on the entitlement type. + parameters: + - name: customerId + in: path + required: true + schema: + type: string + - name: featureKey + in: path + required: true + schema: + type: string + - name: time + in: query + required: false + schema: + type: string + format: date-time + example: '2023-01-01T01:01:01.001Z' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/EntitlementValue' + '400': + description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). + content: + application/problem+json: + schema: + $ref: '#/components/schemas/BadRequestProblemResponse' + '401': + description: The request has not been applied because it lacks valid authentication credentials for the target resource. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/UnauthorizedProblemResponse' + '403': + description: The server understood the request but refuses to authorize it. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ForbiddenProblemResponse' + '404': + description: The origin server did not find a current representation for the target resource or is not willing to disclose that one exists. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/NotFoundProblemResponse' + '500': + description: The server encountered an unexpected condition that prevented it from fulfilling the request. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/InternalServerErrorProblemResponse' + '503': + description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ServiceUnavailableProblemResponse' + default: + description: An unexpected error response. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/UnexpectedProblemResponse' + tags: + - Customers (Private Preview) /api/v1/customers/{id}: get: operationId: getCustomer @@ -2395,8 +2469,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2458,8 +2532,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2527,8 +2601,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -2742,8 +2816,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4260,8 +4334,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4329,8 +4403,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4395,8 +4469,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -4459,7 +4533,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: to in: query required: false @@ -4469,7 +4543,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: feature in: query required: false @@ -4503,9 +4577,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: channel in: query required: false @@ -4517,9 +4591,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - $ref: '#/components/parameters/Pagination.page' - $ref: '#/components/parameters/Pagination.pageSize' - $ref: '#/components/parameters/NotificationEventOrderByOrdering.order' @@ -4805,8 +4879,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4874,8 +4948,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4940,8 +5014,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -5000,8 +5074,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '201': description: The request has succeeded and a new resource has been created as a result. @@ -5132,9 +5206,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: key in: query required: false @@ -5277,9 +5351,9 @@ paths: schema: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string minLength: 1 maxLength: 64 @@ -5349,8 +5423,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -5419,9 +5493,9 @@ paths: schema: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string minLength: 1 maxLength: 64 @@ -5504,8 +5578,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -5564,8 +5638,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -5628,8 +5702,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -6636,7 +6710,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' responses: '200': description: The request has succeeded. @@ -6847,7 +6921,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: to in: query required: false @@ -6857,7 +6931,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: windowSize in: query required: true @@ -7066,8 +7140,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: at in: query required: false @@ -7075,7 +7149,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' explode: false responses: '200': @@ -7140,8 +7214,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7216,8 +7290,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7285,8 +7359,8 @@ paths: effectiveDate: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: If not provided the subscription is canceled immediately. + example: '2023-01-01T01:01:01.001Z' /api/v1/subscriptions/{subscriptionId}/change: post: operationId: changeSubscription @@ -7300,8 +7374,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7376,8 +7450,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7456,8 +7530,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7631,9 +7705,9 @@ components: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH explode: false InvoiceListParams.expand: name: expand @@ -7671,7 +7745,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' explode: false InvoiceListParams.issuedBefore: name: issuedBefore @@ -7681,7 +7755,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' explode: false InvoiceListParams.statuses: name: statuses @@ -7772,7 +7846,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' MeterQuery.groupBy: name: groupBy in: query @@ -7804,7 +7878,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' MeterQuery.windowSize: name: windowSize in: query @@ -8066,9 +8140,9 @@ components: Annotations: type: object additionalProperties: {} + description: Set of key-value pairs managed by the system. Cannot be modified by user. example: externalId: 019142cc-a016-796a-8113-1a942fecd26d - description: Set of key-value pairs managed by the system. Cannot be modified by user. App: anyOf: - $ref: '#/components/schemas/StripeApp' @@ -8135,15 +8209,15 @@ components: description: type: string description: The capability description. + description: |- + App capability. + + Capabilities only exist in config so they don't extend the Resource model. example: type: collectPayments key: stripe_collect_payment name: Collect Payments description: Stripe payments collects outstanding revenue with Stripe customer's default payment method. - description: |- - App capability. - - Capabilities only exist in config so they don't extend the Resource model. AppCapabilityType: type: string enum: @@ -8186,9 +8260,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: |- App reference @@ -8222,14 +8296,14 @@ components: usage: type: number format: double - example: 100 description: The total usage of the feature in the period. + example: 100 readOnly: true balanceAtStart: type: number format: double - example: 100 description: The entitlement balance at the start of the period. + example: 100 readOnly: true description: The balance history window. BillingLineCharge: @@ -8243,29 +8317,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ID of the charge or discount. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true percent: allOf: @@ -8346,9 +8420,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -8372,22 +8446,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true supplier: @@ -8467,27 +8541,27 @@ components: tax: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string description: The tax app used for this workflow x-go-type: string invoicing: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string description: The invoicing app used for this workflow x-go-type: string payment: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string description: The payment app used for this workflow x-go-type: string @@ -8551,34 +8625,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true workflow: $ref: '#/components/schemas/BillingProfileCustomerWorkflowOverride' billingProfile: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The billing profile this override is associated with. If not provided, the default billing profile is chosen if available. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Customer specific workflow overrides. BillingProfileCustomerOverrideCreate: type: object @@ -8587,12 +8661,12 @@ components: $ref: '#/components/schemas/BillingProfileCustomerWorkflowOverrideCreate' billingProfile: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The billing profile this override is associated with. If not provided, the default billing profile is chosen if available. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Payload for creating a new or updating an existing customer override. BillingProfileCustomerOverrideOrderBy: type: string @@ -8609,16 +8683,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -8703,16 +8777,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -8815,12 +8889,12 @@ components: interval: type: string format: ISO8601 - example: P1D description: |- This grace period can be used to delay the collection of the pending line items specified in alignment. This is useful, in case of multiple subscriptions having slightly different billing periods. + example: P1D default: PT1H description: Workflow collection specifies how to collect the pending line items for an invoice BillingWorkflowCreate: @@ -8849,14 +8923,14 @@ components: draftPeriod: type: string format: ISO8601 - example: P1D description: The period for the invoice to be kept in draft status for manual reviews. + example: P1D default: P1D dueAfter: type: string format: ISO8601 - example: P1D description: The period after which the invoice is due. + example: P1D default: P7D progressiveBilling: type: boolean @@ -8927,13 +9001,13 @@ components: description: The request could not be completed due to a conflict with the current state of the target resource. CountryCode: type: string - example: US minLength: 2 maxLength: 2 pattern: ^[A-Z]{2}$ description: |- [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. Custom two-letter country codes are also supported for convenience. + example: US CreateStripeCheckoutSessionRequest: type: object required: @@ -8942,9 +9016,9 @@ components: properties: appId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: If not provided, the default Stripe app is used if any. + example: 01G65Z755AFWAKHE12NY0CQ9FH customer: anyOf: - $ref: '#/components/schemas/CustomerId' @@ -9001,9 +9075,9 @@ components: properties: customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The OpenMeter customer ID. + example: 01G65Z755AFWAKHE12NY0CQ9FH stripeCustomerId: type: string description: The Stripe customer ID. @@ -9045,8 +9119,8 @@ components: issuedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: IssueAt reflects the time the document was issued. + example: '2023-01-01T01:01:01.001Z' readOnly: true number: allOf: @@ -9086,13 +9160,13 @@ components: description: Currency describes a currency supported by OpenMeter. CurrencyCode: type: string - example: USD minLength: 3 maxLength: 3 pattern: ^[A-Z]{3}$ description: |- Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. Custom three-letter currency codes are also supported for convenience. + example: USD CustomPlanInput: type: object allOf: @@ -9146,8 +9220,8 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' customPlan: $ref: '#/components/schemas/CustomPlanInput' description: Change a custom subscription. @@ -9161,15 +9235,15 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' customPlan: $ref: '#/components/schemas/CustomPlanInput' customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Create a custom subscription. Customer: type: object @@ -9182,9 +9256,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -9208,22 +9282,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true usageAttribution: @@ -9251,20 +9325,20 @@ components: title: Billing Address currentSubscriptionId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The ID of the Subscription if the customer has one. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: Current Subscription ID readOnly: true + description: A customer object. example: id: 01G65Z755AFWAKHE12NY0CQ9FH name: ACME Inc. usageAttribution: subjectKeys: - my_subject_key - createdAt: 2024-01-01T01:01:01.001Z - updatedAt: 2024-01-01T01:01:01.001Z - description: A customer object. + createdAt: '2024-01-01T01:01:01.001Z' + updatedAt: '2024-01-01T01:01:01.001Z' CustomerAppData: anyOf: - $ref: '#/components/schemas/StripeCustomerAppData' @@ -9288,16 +9362,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -9359,9 +9433,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Create Stripe checkout session customer ID. CustomerOrderBy: type: string @@ -9380,16 +9454,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -9606,22 +9680,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -9631,18 +9705,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true type: allOf: @@ -9665,9 +9739,9 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV currentUsagePeriod: allOf: - $ref: '#/components/schemas/Period' @@ -9696,22 +9770,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -9721,18 +9795,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true subjectKey: type: string @@ -9750,9 +9824,9 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV currentUsagePeriod: allOf: - $ref: '#/components/schemas/Period' @@ -9780,11 +9854,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -9824,34 +9898,33 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true amount: type: number format: double - example: 100 minimum: 0 description: The amount to grant. Should be a positive number. + example: 100 priority: type: integer format: uint8 - example: 1 minimum: 1 maximum: 255 description: |- @@ -9861,11 +9934,12 @@ components: When there are several grants available for the same subject, the system selects the grant with the highest priority. In cases where grants share the same priority level, the grant closest to its expiration will be used first. In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + example: 1 effectiveAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + example: '2023-01-01T01:01:01.001Z' expiration: allOf: - $ref: '#/components/schemas/ExpirationPeriod' @@ -9873,52 +9947,52 @@ components: maxRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 minRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 metadata: allOf: - $ref: '#/components/schemas/Metadata' + description: The grant metadata. example: stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB - description: The grant metadata. id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true entitlementId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV description: The unique entitlement ULID that the grant is associated with. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true nextRecurrence: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The next time the grant will recurr. + example: '2023-01-01T01:01:01.001Z' expiresAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the grant expires. + example: '2023-01-01T01:01:01.001Z' readOnly: true voidedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the grant was voided. + example: '2023-01-01T01:01:01.001Z' recurrence: allOf: - $ref: '#/components/schemas/RecurringPeriod' @@ -9934,13 +10008,12 @@ components: amount: type: number format: double - example: 100 minimum: 0 description: The amount to grant. Should be a positive number. + example: 100 priority: type: integer format: uint8 - example: 1 minimum: 1 maximum: 255 description: |- @@ -9950,11 +10023,12 @@ components: When there are several grants available for the same subject, the system selects the grant with the highest priority. In cases where grants share the same priority level, the grant closest to its expiration will be used first. In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + example: 1 effectiveAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + example: '2023-01-01T01:01:01.001Z' expiration: allOf: - $ref: '#/components/schemas/ExpirationPeriod' @@ -9962,25 +10036,25 @@ components: maxRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 minRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 metadata: allOf: - $ref: '#/components/schemas/Metadata' + description: The grant metadata. example: stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB - description: The grant metadata. recurrence: allOf: - $ref: '#/components/schemas/RecurringPeriodCreateInput' @@ -10042,22 +10116,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -10067,18 +10141,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true subjectKey: type: string @@ -10096,14 +10170,14 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV lastReset: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the last reset happened. + example: '2023-01-01T01:01:01.001Z' readOnly: true currentUsagePeriod: allOf: @@ -10113,8 +10187,8 @@ components: measureUsageFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + example: '2023-01-01T01:01:01.001Z' readOnly: true usagePeriod: allOf: @@ -10141,11 +10215,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -10212,16 +10286,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -10248,27 +10322,27 @@ components: config: type: string format: json - example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + example: '{ "integrations": ["github"] }' createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -10278,18 +10352,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true subjectKey: type: string @@ -10307,9 +10381,9 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV currentUsagePeriod: allOf: - $ref: '#/components/schemas/Period' @@ -10336,11 +10410,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -10356,8 +10430,8 @@ components: config: type: string format: json - example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + example: '{ "integrations": ["github"] }' description: Create inputs for static entitlement EntitlementType: type: string @@ -10374,31 +10448,31 @@ components: properties: hasAccess: type: boolean - example: true description: Whether the subject has access to the feature. Shared accross all entitlement types. + example: true readOnly: true balance: type: number format: double - example: 100 description: Only available for metered entitlements. Metered entitlements are built around a balance calculation where feature usage is deducted from the issued grants. Balance represents the remaining balance of the entitlement, it's value never turns negative. + example: 100 readOnly: true usage: type: number format: double - example: 50 description: Only available for metered entitlements. Returns the total feature usage in the current period. + example: 50 readOnly: true overage: type: number format: double - example: 0 description: Only available for metered entitlements. Overage represents the usage that wasn't covered by grants, e.g. if the subject had a total feature usage of 100 in the period but they were only granted 80, there would be 20 overage. + example: 0 readOnly: true config: type: string - example: '{ key: "value" }' description: Only available for static entitlements. The JSON parsable config of the entitlement. + example: '{ key: "value" }' readOnly: true description: Entitlements are the core of OpenMeter access management. They define access to features for subjects. Entitlements can be metered, boolean, or static. Event: @@ -10412,33 +10486,33 @@ components: properties: id: type: string - example: 5c10fade-1c9e-4d6c-8275-c52c36731d3c minLength: 1 description: Identifies the event. + example: 5c10fade-1c9e-4d6c-8275-c52c36731d3c source: type: string - example: service-name minLength: 1 format: uri-reference description: Identifies the context in which an event happened. + example: service-name specversion: type: string - example: '1.0' minLength: 1 description: The version of the CloudEvents specification which the event uses. + example: '1.0' default: '1.0' type: type: string - example: com.example.someevent minLength: 1 description: Contains a value describing the type of event related to the originating occurrence. + example: com.example.someevent datacontenttype: type: string enum: - application/json nullable: true - example: application/json description: Content type of the CloudEvents data value. Only the value "application/json" is allowed over HTTP. + example: application/json dataschema: type: string format: uri @@ -10447,14 +10521,14 @@ components: description: Identifies the schema that data adheres to. subject: type: string - example: customer-id minLength: 1 description: Describes the subject of the event in the context of the event producer (identified by source). + example: customer-id time: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp of when the occurrence happened. Must adhere to RFC 3339. + example: '2023-01-01T01:01:01.001Z' nullable: true data: type: object @@ -10463,18 +10537,18 @@ components: description: |- The event payload. Optional, if present it must be a JSON object. + description: |- + CloudEvents Specification JSON Schema + + Optional properties are nullable according to the CloudEvents specification: + OPTIONAL not omitted attributes MAY be represented as a null JSON value. example: id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c source: service-name specversion: '1.0' type: prompt subject: customer-id - time: 2023-01-01T01:01:01.001Z - description: |- - CloudEvents Specification JSON Schema - - Optional properties are nullable according to the CloudEvents specification: - OPTIONAL not omitted attributes MAY be represented as a null JSON value. + time: '2023-01-01T01:01:01.001Z' x-go-type-import: path: github.com/cloudevents/sdk-go/v2/event x-go-type: event.Event @@ -10499,8 +10573,8 @@ components: description: The unit of time for the expiration period. count: type: integer - example: 12 description: The number of time units in the expiration period. + example: 12 description: The grant expiration definition Feature: type: object @@ -10514,29 +10588,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true archivedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp of when the resource was archived. + example: '2023-01-01T01:01:01.001Z' title: Archival Time readOnly: true key: @@ -10552,35 +10626,35 @@ components: metadata: allOf: - $ref: '#/components/schemas/Metadata' + title: Optional metadata example: key: value - title: Optional metadata meterSlug: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A key is a unique string that is used to identify a resource. - example: tokens_total title: Meter slug + example: tokens_total meterGroupByFilters: type: object additionalProperties: type: string - example: - model: gpt-4 - type: input description: |- Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. Example scenario would be a meter tracking all token use with groupBy fields for the model, then the feature could filter for model=gpt-4. title: Meter group by filters + example: + model: gpt-4 + type: input id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true description: |- Represents a feature that can be enabled or disabled for a plan. @@ -10604,30 +10678,30 @@ components: metadata: allOf: - $ref: '#/components/schemas/Metadata' + title: Optional metadata example: key: value - title: Optional metadata meterSlug: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A key is a unique string that is used to identify a resource. - example: tokens_total title: Meter slug + example: tokens_total meterGroupByFilters: type: object additionalProperties: type: string - example: - model: gpt-4 - type: input description: |- Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. Example scenario would be a meter tracking all token use with groupBy fields for the model, then the feature could filter for model=gpt-4. title: Meter group by filters + example: + model: gpt-4 + type: input description: |- Represents a feature that can be enabled or disabled for a plan. Used both for product catalog and entitlements. @@ -10639,17 +10713,17 @@ components: properties: id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Unique identifier of a feature. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Feature Unique Identifier key: type: string - example: gpt4_tokens description: |- The key is an immutable unique identifier of the feature used throughout the API, for example when interacting with a subject's entitlements. title: Feature Key + example: gpt4_tokens description: Limited representation of a feature resource which includes only its unique identifiers (id, key). FeatureOrderBy: type: string @@ -10668,16 +10742,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -10750,44 +10824,44 @@ components: usage: type: number format: double - example: 100 description: The total usage of the grant in the period. + example: 100 readOnly: true overage: type: number format: double - example: 100 description: Overuse that wasn't covered by grants. + example: 100 readOnly: true balanceAtStart: type: number format: double - example: 100 description: entitlement balance at the start of the period. + example: 100 readOnly: true grantBalancesAtStart: type: object additionalProperties: type: number format: double + description: 'The balance breakdown of each active grant at the start of the period: GrantID: Balance' example: 01G65Z755AFWAKHE12NY0CQ9FH: 100 - description: 'The balance breakdown of each active grant at the start of the period: GrantID: Balance' readOnly: true balanceAtEnd: type: number format: double - example: 100 description: The entitlement balance at the end of the period. + example: 100 readOnly: true grantBalancesAtEnd: type: object additionalProperties: type: number format: double + description: 'The balance breakdown of each active grant at the end of the period: GrantID: Balance' example: 01G65Z755AFWAKHE12NY0CQ9FH: 100 - description: 'The balance breakdown of each active grant at the end of the period: GrantID: Balance' readOnly: true grantUsages: type: array @@ -10816,16 +10890,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -10840,14 +10914,14 @@ components: properties: grantId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The id of the grant + example: 01G65Z755AFWAKHE12NY0CQ9FH usage: type: number format: double - example: 100 description: The usage in the period + example: 100 description: Usage Record IDResource: type: object @@ -10856,9 +10930,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true description: IDResource is a resouce with an ID. @@ -10888,13 +10962,14 @@ components: ingestedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time the event was ingested. + example: '2023-01-01T01:01:01.001Z' storedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time the event was stored. + example: '2023-01-01T01:01:01.001Z' + description: An ingested event with optional validation error. example: event: id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c @@ -10902,10 +10977,9 @@ components: specversion: '1.0' type: prompt subject: customer-id - time: 2023-01-01T01:01:01.001Z - ingestedAt: 2023-01-01T01:01:01.001Z - storedAt: 2023-01-01T01:01:02.001Z - description: An ingested event with optional validation error. + time: '2023-01-01T01:01:01.001Z' + ingestedAt: '2023-01-01T01:01:01.001Z' + storedAt: '2023-01-01T01:01:02.001Z' InternalServerErrorProblemResponse: type: object allOf: @@ -10928,9 +11002,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true description: @@ -10948,22 +11022,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true type: @@ -11032,29 +11106,29 @@ components: issuedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time the invoice was issued. Depending on the status of the invoice this can mean multiple things: - draft, gathering: The time the invoice will be issued based on the workflow settings. - issued: The time the invoice was issued. + example: '2023-01-01T01:01:01.001Z' readOnly: true draftUntil: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time until the invoice is in draft status. On draft invoice creation it is calculated from the workflow settings. If manual approval is required, the draftUntil time is set. + example: '2023-01-01T01:01:01.001Z' dueAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Due time of the fulfillment of the invoice (if available). + example: '2023-01-01T01:01:01.001Z' readOnly: true period: allOf: @@ -11063,11 +11137,11 @@ components: voidedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time the invoice was voided. If the invoice was voided, this field will be set to the time the invoice was voided. + example: '2023-01-01T01:01:01.001Z' readOnly: true workflow: allOf: @@ -11243,29 +11317,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH status: allOf: - $ref: '#/components/schemas/InvoiceLineStatus' @@ -11334,8 +11408,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' externalIDs: allOf: - $ref: '#/components/schemas/InvoiceLineAppExternalIDs' @@ -11400,9 +11474,9 @@ components: title: Metadata id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH taxConfig: allOf: - $ref: '#/components/schemas/TaxConfig' @@ -11417,8 +11491,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11484,8 +11558,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11557,8 +11631,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11583,9 +11657,9 @@ components: default: regular customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer this line item belongs to. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceFlatFeePendingLineCreate represents the create model for an invoice line that is sold to the customer as a manually added fee. InvoiceGenericDocumentRef: type: object @@ -11644,29 +11718,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ID of the charge or discount. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true percent: allOf: @@ -11777,7 +11851,6 @@ components: description: TaxConfig stores the configuration for a tax line relative to an invoice line. InvoiceNumber: type: string - example: INV-2024-01-01-01 minLength: 1 maxLength: 256 description: |- @@ -11787,6 +11860,7 @@ components: The uniqueness depends on a lot of factors: - app setting (unique per app or unique per customer) - multiple app scenarios (multiple apps generating invoices with the same prefix) + example: INV-2024-01-01-01 InvoiceOrderBy: type: string enum: @@ -11806,16 +11880,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -11849,9 +11923,9 @@ components: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: |- The pending line items to include in the invoice, if not provided: - all line items that have invoice_at < asOf will be included @@ -11860,16 +11934,16 @@ components: asOf: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time as of which the invoice is created. If not provided, the current time is used. + example: '2023-01-01T01:01:01.001Z' customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer ID for which to create the invoice. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: |- BillingInvoiceActionInput is the input for creating an invoice. @@ -11882,9 +11956,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The ID of the invoice. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true number: allOf: @@ -11915,13 +11989,13 @@ components: draftUntil: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time until the invoice is in draft status. On draft invoice creation it is calculated from the workflow settings. If manual approval is required, the draftUntil time is set. + example: '2023-01-01T01:01:01.001Z' supplier: $ref: '#/components/schemas/BillingPartyReplaceUpdate' customer: @@ -11975,8 +12049,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12001,12 +12075,12 @@ components: default: regular id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- ID of the line. If not specified it will be auto-generated. When discounts are specified, this must be provided, so that the discount can reference it. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceSimulationFlatFeeLine represents a flat fee line item that can be input to the simulation endpoint. InvoiceSimulationInput: type: object @@ -12084,8 +12158,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12108,12 +12182,12 @@ components: description: The quantity of the item used before this line's period, if the line is billed progressively. id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- ID of the line. If not specified it will be auto-generated. When discounts are specified, this must be provided, so that the discount can reference it. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceSimulationUsageBasedLine represents a usage-based line item that can be input to the simulation endpoint. InvoiceStatus: type: string @@ -12245,29 +12319,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH status: allOf: - $ref: '#/components/schemas/InvoiceLineStatus' @@ -12336,8 +12410,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' externalIDs: allOf: - $ref: '#/components/schemas/InvoiceLineAppExternalIDs' @@ -12405,9 +12479,9 @@ components: title: Metadata id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH taxConfig: allOf: - $ref: '#/components/schemas/TaxConfig' @@ -12422,8 +12496,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12479,8 +12553,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12542,8 +12616,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12558,9 +12632,9 @@ components: description: The feature that the usage is based on. customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer this line item belongs to. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceUsageBasedLineCreateWithCustomer represents the create model for an invoice line that is sold to the customer based on usage. InvoiceWorkflowInvoicingSettingsReplaceUpdate: type: object @@ -12572,14 +12646,14 @@ components: draftPeriod: type: string format: ISO8601 - example: P1D description: The period for the invoice to be kept in draft status for manual reviews. + example: P1D default: P1D dueAfter: type: string format: ISO8601 - example: P1D description: The period after which the invoice is due. + example: P1D default: P7D description: InvoiceWorkflowInvoicingSettingsReplaceUpdate represents the update model for the invoicing settings of an invoice workflow. InvoiceWorkflowReplaceUpdate: @@ -12606,13 +12680,13 @@ components: readOnly: true sourceBillingProfileID: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- sourceBillingProfileID is the billing profile on which the workflow was based on. The profile is snapshotted on invoice creation, after which it can be altered independently of the profile itself. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true workflow: allOf: @@ -12693,6 +12767,11 @@ components: items: $ref: '#/components/schemas/AppCapability' description: The app's capabilities. + description: |- + A marketplace listing. + Represent an available app in the app marketplace that can be installed to the organization. + + Marketplace apps only exist in config so they don't extend the Resource model. example: type: stripe name: Stripe @@ -12710,11 +12789,6 @@ components: key: stripe_collect_payments name: Collect Payments description: Stripe payments collects outstanding revenue with Stripe customer's default payment method. - description: |- - A marketplace listing. - Represent an available app in the app marketplace that can be installed to the organization. - - Marketplace apps only exist in config so they don't extend the Resource model. MarketplaceListingList: type: object required: @@ -12758,17 +12832,17 @@ components: MeasureUsageFromTime: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' Metadata: type: object additionalProperties: type: string - example: - externalId: 019142cc-a016-796a-8113-1a942fecd26d description: |- Set of key-value pairs. Metadata can be used to store additional information about a resource. + example: + externalId: 019142cc-a016-796a-8113-1a942fecd26d x-go-type: map[string]string Meter: type: object @@ -12781,9 +12855,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the meter. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true slug: type: string @@ -12796,9 +12870,9 @@ components: example: tokens_total description: type: string - example: AI Token Usage minLength: 1 description: A description of the meter. + example: AI Token Usage aggregation: allOf: - $ref: '#/components/schemas/MeterAggregation' @@ -12809,12 +12883,11 @@ components: example: MINUTE eventType: type: string - example: prompt minLength: 1 description: The event type to aggregate. + example: prompt valueProperty: type: string - example: $.tokens minLength: 1 description: |- JSONPath expression to extract the value from the ingested event's data property. @@ -12822,18 +12895,20 @@ components: The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a string that can be parsed to a number. For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT aggregation the valueProperty is ignored. + example: $.tokens groupBy: type: object additionalProperties: type: string - example: - type: $.type description: |- Named JSONPath expressions to extract the group by values from the event data. Keys must be unique and consist only alphanumeric and underscore characters. TODO: add key format enforcement + example: + type: $.type + description: A meter is a configuration that defines how to match and aggregate events. example: id: 01G65Z755AFWAKHE12NY0CQ9FH slug: tokens_total @@ -12845,7 +12920,6 @@ components: groupBy: model: $.model type: $.type - description: A meter is a configuration that defines how to match and aggregate events. x-go-type-import: path: github.com/openmeterio/openmeter/pkg/models x-go-type: models.Meter @@ -12881,9 +12955,9 @@ components: example: tokens_total description: type: string - example: AI Token Usage minLength: 1 description: A description of the meter. + example: AI Token Usage aggregation: allOf: - $ref: '#/components/schemas/MeterAggregation' @@ -12894,12 +12968,11 @@ components: example: MINUTE eventType: type: string - example: prompt minLength: 1 description: The event type to aggregate. + example: prompt valueProperty: type: string - example: $.tokens minLength: 1 description: |- JSONPath expression to extract the value from the ingested event's data property. @@ -12907,18 +12980,20 @@ components: The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a string that can be parsed to a number. For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT aggregation the valueProperty is ignored. + example: $.tokens groupBy: type: object additionalProperties: type: string - example: - type: $.type description: |- Named JSONPath expressions to extract the group by values from the event data. Keys must be unique and consist only alphanumeric and underscore characters. TODO: add key format enforcement + example: + type: $.type + description: A meter is a configuration that defines how to match and aggregate events. example: slug: tokens_total description: AI Token Usage @@ -12929,7 +13004,6 @@ components: groupBy: model: $.model type: $.type - description: A meter is a configuration that defines how to match and aggregate events. x-go-type-import: path: github.com/openmeterio/openmeter/pkg/models x-go-type: models.Meter @@ -12941,32 +13015,32 @@ components: from: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' to: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' windowSize: $ref: '#/components/schemas/WindowSize' data: type: array items: $ref: '#/components/schemas/MeterQueryRow' + description: The result of a meter query. example: - from: 2023-01-01T00:00:00Z - to: 2023-01-02T00:00:00Z + from: '2023-01-01T00:00:00Z' + to: '2023-01-02T00:00:00Z' windowSize: DAY data: - value: 12 - windowStart: 2023-01-01T00:00:00Z - windowEnd: 2023-01-02T00:00:00Z + windowStart: '2023-01-01T00:00:00Z' + windowEnd: '2023-01-02T00:00:00Z' subject: customer-1 groupBy: model: gpt-4-turbo type: prompt - description: The result of a meter query. MeterQueryRow: type: object required: @@ -12979,28 +13053,28 @@ components: windowStart: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' windowEnd: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' subject: type: string groupBy: type: object additionalProperties: type: string + description: A row in the result of a meter query. example: value: 12 - windowStart: 2023-01-01T00:00:00Z - windowEnd: 2023-01-02T00:00:00Z + windowStart: '2023-01-01T00:00:00Z' + windowEnd: '2023-01-02T00:00:00Z' subject: customer-1 groupBy: model: gpt-4-turbo type: prompt - description: A row in the result of a meter query. x-go-type-import: path: github.com/openmeterio/openmeter/pkg/models x-go-type: models.MeterQueryRow @@ -13032,9 +13106,9 @@ components: properties: id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification channel. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Channel Unique Identifier readOnly: true type: @@ -13062,16 +13136,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13098,29 +13172,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification channel. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Channel Unique Identifier readOnly: true type: @@ -13131,20 +13205,20 @@ components: title: Channel Type name: type: string - example: customer-webhook description: User friendly name of the channel. title: Channel Name + example: customer-webhook disabled: type: boolean - example: true description: Whether the channel is disabled or not. title: Channel Disabled + example: true default: false url: type: string - example: https://example.com/webhook description: Webhook URL where the notification is sent. title: Webhook URL + example: https://example.com/webhook customHeaders: type: object additionalProperties: @@ -13153,13 +13227,13 @@ components: title: Custom HTTP Headers signingSecret: type: string - example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 pattern: ^(whsec_)?[a-zA-Z0-9+/=]{32,100}$ description: |- Signing secret used for webhook request validation on the receiving end. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24 title: Signing Secret + example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 description: Notification channel with webhook type. NotificationChannelWebhookCreateRequest: type: object @@ -13176,20 +13250,20 @@ components: title: Channel Type name: type: string - example: customer-webhook description: User friendly name of the channel. title: Channel Name + example: customer-webhook disabled: type: boolean - example: true description: Whether the channel is disabled or not. title: Channel Disabled + example: true default: false url: type: string - example: https://example.com/webhook description: Webhook URL where the notification is sent. title: Webhook URL + example: https://example.com/webhook customHeaders: type: object additionalProperties: @@ -13198,13 +13272,13 @@ components: title: Custom HTTP Headers signingSecret: type: string - example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 pattern: ^(whsec_)?[a-zA-Z0-9+/=]{32,100}$ description: |- Signing secret used for webhook request validation on the receiving end. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24 title: Signing Secret + example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 description: Request with input parameters for creating new notification channel with webhook type. NotificationEvent: type: object @@ -13218,9 +13292,9 @@ components: properties: id: type: string - example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier of the notification event. + example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 title: Event Identifier readOnly: true type: @@ -13232,8 +13306,8 @@ components: createdAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp when the notification event was created in RFC 3339 format. + example: '2023-01-01T01:01:01.001Z' title: Creation Time readOnly: true rule: @@ -13270,9 +13344,9 @@ components: properties: id: type: string - example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the notification event the payload belongs to. + example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 title: Notification Event Identifier readOnly: true type: @@ -13285,8 +13359,8 @@ components: timestamp: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp when the notification event was created in RFC 3339 format. + example: '2023-01-01T01:01:01.001Z' title: Creation Time readOnly: true data: @@ -13342,20 +13416,20 @@ components: state: allOf: - $ref: '#/components/schemas/NotificationEventDeliveryStatusState' - example: SUCCESS description: Delivery state of the notification event to the channel. + example: SUCCESS readOnly: true reason: type: string - example: Failed to dispatch event due to provider error. description: The reason of the last deliverry state update. title: State Reason + example: Failed to dispatch event due to provider error. readOnly: true updatedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp of when the status was last updated in RFC 3339 format. + example: '2023-01-01T01:01:01.001Z' title: Last Update Time readOnly: true channel: @@ -13395,16 +13469,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13440,29 +13514,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification rule. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Rule Unique Identifier readOnly: true type: @@ -13473,14 +13547,14 @@ components: title: Rule Type name: type: string - example: Balance threshold reached description: The user friendly name of the notification rule. title: Rule Name + example: Balance threshold reached disabled: type: boolean - example: true description: Whether the rule is disabled or not. title: Rule Disabled + example: true default: false channels: type: array @@ -13520,14 +13594,14 @@ components: title: Rule Type name: type: string - example: Balance threshold reached description: The user friendly name of the notification rule. title: Rule Name + example: Balance threshold reached disabled: type: boolean - example: true description: Whether the rule is disabled or not. title: Rule Disabled + example: true default: false thresholds: type: array @@ -13541,9 +13615,9 @@ components: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH minItems: 1 description: List of notification channels the rule is applied to. title: Channels @@ -13572,14 +13646,14 @@ components: value: type: number format: double - example: 100 description: Value of the threshold. title: Threshold Value + example: 100 type: allOf: - $ref: '#/components/schemas/NotificationRuleBalanceThresholdValueType' - example: NUMBER description: Type of the threshold. + example: NUMBER description: Threshold value with multiple supported types. NotificationRuleBalanceThresholdValueType: type: string @@ -13614,16 +13688,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13654,8 +13728,8 @@ components: dueAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: When the payment is due. + example: '2023-01-01T01:01:01.001Z' readOnly: true notes: type: string @@ -13741,13 +13815,13 @@ components: from: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Period start time. + example: '2023-01-01T01:01:01.001Z' to: type: string format: date-time - example: 2023-02-01T01:01:01.001Z description: Period end time. + example: '2023-02-01T01:01:01.001Z' description: A period with a start and end time. Plan: type: object @@ -13764,9 +13838,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -13790,22 +13864,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true key: @@ -13831,15 +13905,15 @@ components: effectiveFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time when the plan becomes effective. When not specified, the plan is a draft. + example: '2023-01-01T01:01:01.001Z' title: Effective start date readOnly: true effectiveTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time when the plan is no longer effective. When not specified, the plan is effective indefinitely. + example: '2023-01-01T01:01:01.001Z' title: Effective end date readOnly: true status: @@ -13932,16 +14006,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13985,9 +14059,9 @@ components: type: string format: duration nullable: true - example: P1Y description: The duration of the phase. title: Duration + example: P1Y rateCards: type: array items: @@ -14010,9 +14084,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The plan ID. + example: 01G65Z755AFWAKHE12NY0CQ9FH key: type: string minLength: 1 @@ -14094,8 +14168,8 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' name: type: string description: @@ -14116,17 +14190,17 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' name: type: string description: type: string customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Create subscription based on plan. PortalToken: type: object @@ -14135,9 +14209,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true subject: type: string @@ -14145,8 +14219,8 @@ components: expiresAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' readOnly: true expired: type: boolean @@ -14154,21 +14228,21 @@ components: createdAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' readOnly: true token: type: string - example: om_portal_IAnD3PpWW2A2Wr8m9jfzeHlGX8xmCXwG.y5q4S-AWqFu6qjfaFz0zQq4Ez28RsnyVwJffX5qxMvo description: The token is only returned at creation. + example: om_portal_IAnD3PpWW2A2Wr8m9jfzeHlGX8xmCXwG.y5q4S-AWqFu6qjfaFz0zQq4Ez28RsnyVwJffX5qxMvo readOnly: true allowedMeterSlugs: type: array items: type: string + description: Optional, if defined only the specified meters will be allowed. example: - tokens_total - description: Optional, if defined only the specified meters will be allowed. description: |- A consumer portal token. @@ -14328,11 +14402,14 @@ components: allOf: - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' nullable: true - example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price + example: + type: flat + amount: '100' + paymentTerm: in_arrears description: A flat fee rate card defines a one-time purchase or a recurring fee. RateCardMeteredEntitlement: type: object @@ -14400,8 +14477,8 @@ components: config: type: string format: json - example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + example: '{ "integrations": ["github"] }' description: Entitlement template of a static entitlement. RateCardUsageBased: type: object @@ -14507,14 +14584,14 @@ components: anchor: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: A date-time anchor to base the recurring period on. + example: '2023-01-01T01:01:01.001Z' title: Anchor time + description: Recurring period with an interval and an anchor. example: interval: DAY intervalISO: P1D - anchor: 2023-01-01T01:01:01.001Z - description: Recurring period with an interval and an anchor. + anchor: '2023-01-01T01:01:01.001Z' RecurringPeriodCreateInput: type: object required: @@ -14528,13 +14605,13 @@ components: anchor: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: A date-time anchor to base the recurring period on. + example: '2023-01-01T01:01:01.001Z' title: Anchor time + description: Recurring period with an interval and an anchor. example: interval: DAY - anchor: 2023-01-01T01:01:01.001Z - description: Recurring period with an interval and an anchor. + anchor: '2023-01-01T01:01:01.001Z' RecurringPeriodInterval: anyOf: - type: string @@ -14563,8 +14640,8 @@ components: effectiveAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time at which the reset takes effect, defaults to now. The reset cannot be in the future. The provided value is truncated to the minute due to how historical meter data is stored. + example: '2023-01-01T01:01:01.001Z' retainAnchor: type: boolean description: |- @@ -14592,9 +14669,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -14618,22 +14695,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true listing: @@ -14673,11 +14750,11 @@ components: readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The app ID. If not provided, it will use the global default for the app type. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: App ID type: type: string @@ -14724,9 +14801,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -14750,22 +14827,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true listing: @@ -14799,6 +14876,7 @@ components: description: |- The masked API key. Only shows the first 8 and last 3 characters. + description: A installed Stripe app object. example: id: 01G65Z755AFWAKHE12NY0CQ9FH type: stripe @@ -14822,12 +14900,11 @@ components: key: stripe_collect_payments name: Collect Payments description: Stripe payments collects outstanding revenue with Stripe customer's default payment method. - createdAt: 2024-01-01T01:01:01.001Z - updatedAt: 2024-01-01T01:01:01.001Z + createdAt: '2024-01-01T01:01:01.001Z' + updatedAt: '2024-01-01T01:01:01.001Z' stripeAccountId: acct_123456789 livemode: true maskedAPIKey: sk_live_************abc - description: A installed Stripe app object. StripeCheckoutSessionMode: type: string enum: @@ -14841,11 +14918,11 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The app ID. If not provided, it will use the global default for the app type. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: App ID type: type: string @@ -14864,10 +14941,10 @@ components: stripeDefaultPaymentMethodId: type: string description: The Stripe default payment method ID. + description: Stripe Customer App Data. example: type: stripe stripeCustomerId: cus_xxxxxxxxxxxxxx - description: Stripe Customer App Data. StripePaymentIntentStatus: type: string enum: @@ -14917,13 +14994,13 @@ components: properties: code: type: string - example: txcd_10000000 pattern: ^txcd_\d{8}$ description: |- Product tax code. See: https://docs.stripe.com/tax/tax-codes title: Tax code + example: txcd_10000000 description: The tax config for Stripe. StripeWebhookEvent: type: object @@ -14964,19 +15041,19 @@ components: properties: namespaceId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH appId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Stripe webhook response. Subject: type: object @@ -14986,48 +15063,49 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the subject. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true key: type: string - example: customer-id description: A unique, human-readable identifier for the subject. + example: customer-id displayName: type: string nullable: true - example: Customer Name description: A human-readable display name for the subject. + example: Customer Name metadata: type: object additionalProperties: {} nullable: true - example: {} + example: + hubspotId: '123456' currentPeriodStart: type: string format: date-time - example: 2023-01-01T00:00:00Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T00:00:00Z' currentPeriodEnd: type: string format: date-time - example: 2023-02-01T00:00:00Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-02-01T00:00:00Z' stripeCustomerId: type: string nullable: true example: cus_JMOlctsKV8 + description: A subject is a unique identifier for a user or entity. example: id: 01G65Z755AFWAKHE12NY0CQ9FH key: customer-id displayName: Customer Name metadata: hubspotId: '123456' - currentPeriodStart: 2023-01-01T00:00:00Z - currentPeriodEnd: 2023-02-01T00:00:00Z + currentPeriodStart: '2023-01-01T00:00:00Z' + currentPeriodEnd: '2023-02-01T00:00:00Z' stripeCustomerId: cus_JMOlctsKV8 - description: A subject is a unique identifier for a user or entity. SubjectUpsert: type: object required: @@ -15035,41 +15113,42 @@ components: properties: key: type: string - example: customer-id description: A unique, human-readable identifier for the subject. + example: customer-id displayName: type: string nullable: true - example: Customer Name description: A human-readable display name for the subject. + example: Customer Name metadata: type: object additionalProperties: {} nullable: true - example: {} + example: + hubspotId: '123456' currentPeriodStart: type: string format: date-time - example: 2023-01-01T00:00:00Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T00:00:00Z' currentPeriodEnd: type: string format: date-time - example: 2023-02-01T00:00:00Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-02-01T00:00:00Z' stripeCustomerId: type: string nullable: true example: cus_JMOlctsKV8 + description: A subject is a unique identifier for a user or entity. example: key: customer-id displayName: Customer Name metadata: hubspotId: '123456' - currentPeriodStart: 2023-01-01T00:00:00Z - currentPeriodEnd: 2023-02-01T00:00:00Z + currentPeriodStart: '2023-01-01T00:00:00Z' + currentPeriodEnd: '2023-02-01T00:00:00Z' stripeCustomerId: cus_JMOlctsKV8 - description: A subject is a unique identifier for a user or entity. Subscription: type: object required: @@ -15084,9 +15163,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15110,34 +15189,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' status: allOf: - $ref: '#/components/schemas/SubscriptionStatus' @@ -15145,9 +15224,9 @@ components: readOnly: true customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer ID of the subscription. + example: 01G65Z755AFWAKHE12NY0CQ9FH plan: allOf: - $ref: '#/components/schemas/PlanReference' @@ -15230,9 +15309,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15256,34 +15335,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' status: allOf: - $ref: '#/components/schemas/SubscriptionStatus' @@ -15291,9 +15370,9 @@ components: readOnly: true customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer ID of the subscription. + example: 01G65Z755AFWAKHE12NY0CQ9FH plan: allOf: - $ref: '#/components/schemas/PlanReference' @@ -15325,9 +15404,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15351,34 +15430,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' key: type: string minLength: 1 @@ -15423,11 +15502,14 @@ components: allOf: - $ref: '#/components/schemas/TieredPriceWithCommitments' nullable: true - example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price + example: + type: flat + amount: '100' + paymentTerm: in_arrears included: allOf: - $ref: '#/components/schemas/SubscriptionItemIncluded' @@ -15465,19 +15547,19 @@ components: type: string format: duration nullable: true - example: P1Y description: |- Interval after the subscription starts to transition to the phase. When null, the phase starts immediately after the subscription starts. title: Start after + example: P1Y duration: type: string format: duration - example: P1M description: |- The intended duration of the new phase. Duration is required when the phase will not be the last phase. title: Duration + example: P1M discounts: type: array items: @@ -15510,9 +15592,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15536,22 +15618,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true key: @@ -15569,13 +15651,13 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time from which the phase is active. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The until which the Phase is active. + example: '2023-01-01T01:01:01.001Z' items: type: array items: @@ -15683,29 +15765,29 @@ components: type: type: string format: uri - example: about:blank description: Type contains a URI that identifies the problem type. + example: about:blank default: about:blank title: type: string - example: Bad Request description: A a short, human-readable summary of the problem type. + example: Bad Request status: type: integer format: int16 - example: 400 minimum: 400 maximum: 599 description: The HTTP status code generated by the origin server for this occurrence of the problem. + example: 400 detail: type: string - example: The request body must be a JSON object. description: A human-readable explanation specific to this occurrence of the problem. + example: The request body must be a JSON object. instance: type: string format: uri - example: urn:request:local/JMOlctsKV8-000001 description: A URI reference that identifies the specific occurrence of the problem. + example: urn:request:local/JMOlctsKV8-000001 additionalProperties: anyOf: - type: string @@ -15769,29 +15851,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ID of the charge or discount. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true severity: allOf: @@ -15889,9 +15971,9 @@ components: properties: lineId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The line item ID to override. + example: 01G65Z755AFWAKHE12NY0CQ9FH action: allOf: - $ref: '#/components/schemas/VoidInvoiceActionCreateItem' @@ -15939,11 +16021,11 @@ components: nextInvoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time at which the line item should be invoiced again. If not provided, the line item will be re-invoiced now. + example: '2023-01-01T01:01:01.001Z' description: VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. VoidInvoiceLinePendingActionCreateItem: type: object @@ -15957,11 +16039,11 @@ components: nextInvoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time at which the line item should be invoiced again. If not provided, the line item will be re-invoiced now. + example: '2023-01-01T01:01:01.001Z' description: VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. WindowSize: type: string diff --git a/api/openapi.yaml b/api/openapi.yaml index 47aa4448a..496502ff3 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -100,8 +100,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -163,8 +163,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -232,8 +232,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -292,8 +292,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -352,8 +352,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -426,9 +426,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH explode: false - $ref: '#/components/parameters/Pagination.page' - $ref: '#/components/parameters/Pagination.pageSize' @@ -492,8 +492,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -569,8 +569,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -632,8 +632,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -697,8 +697,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -962,8 +962,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: expand in: query required: false @@ -1045,8 +1045,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1107,8 +1107,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1182,8 +1182,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1253,8 +1253,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1317,15 +1317,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: lineId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1387,15 +1387,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: lineId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1453,15 +1453,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: lineId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1533,8 +1533,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1600,8 +1600,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1669,8 +1669,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -1871,8 +1871,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -1930,8 +1930,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: expand in: query required: false @@ -2001,8 +2001,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2187,8 +2187,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - $ref: '#/components/parameters/PaginatedQuery.page' - $ref: '#/components/parameters/PaginatedQuery.pageSize' - $ref: '#/components/parameters/queryCustomerList.type' @@ -2253,8 +2253,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2327,15 +2327,15 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: appId in: path required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -2383,6 +2383,80 @@ paths: $ref: '#/components/schemas/UnexpectedProblemResponse' tags: - Customers (Private Preview) + /api/v1/customers/{customerId}/entitlements/{featureKey}/value: + get: + operationId: getCustomerEntitlementValue + summary: Get entitlement value + description: Checks customer access to a given feature (by key). All entitlement types share the hasAccess property in their value response, but multiple other properties are returned based on the entitlement type. + parameters: + - name: customerId + in: path + required: true + schema: + type: string + - name: featureKey + in: path + required: true + schema: + type: string + - name: time + in: query + required: false + schema: + type: string + format: date-time + example: '2023-01-01T01:01:01.001Z' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/EntitlementValue' + '400': + description: The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). + content: + application/problem+json: + schema: + $ref: '#/components/schemas/BadRequestProblemResponse' + '401': + description: The request has not been applied because it lacks valid authentication credentials for the target resource. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/UnauthorizedProblemResponse' + '403': + description: The server understood the request but refuses to authorize it. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ForbiddenProblemResponse' + '404': + description: The origin server did not find a current representation for the target resource or is not willing to disclose that one exists. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/NotFoundProblemResponse' + '500': + description: The server encountered an unexpected condition that prevented it from fulfilling the request. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/InternalServerErrorProblemResponse' + '503': + description: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ServiceUnavailableProblemResponse' + default: + description: An unexpected error response. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/UnexpectedProblemResponse' + tags: + - Customers (Private Preview) /api/v1/customers/{id}: get: operationId: getCustomer @@ -2394,8 +2468,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2457,8 +2531,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -2526,8 +2600,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -2741,8 +2815,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4149,8 +4223,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4218,8 +4292,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4284,8 +4358,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -4348,7 +4422,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: to in: query required: false @@ -4358,7 +4432,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: feature in: query required: false @@ -4392,9 +4466,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: channel in: query required: false @@ -4406,9 +4480,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - $ref: '#/components/parameters/Pagination.page' - $ref: '#/components/parameters/Pagination.pageSize' - $ref: '#/components/parameters/NotificationEventOrderByOrdering.order' @@ -4694,8 +4768,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4763,8 +4837,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -4829,8 +4903,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -4889,8 +4963,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '201': description: The request has succeeded and a new resource has been created as a result. @@ -5021,9 +5095,9 @@ paths: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: key in: query required: false @@ -5166,9 +5240,9 @@ paths: schema: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string minLength: 1 maxLength: 64 @@ -5238,8 +5312,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -5308,9 +5382,9 @@ paths: schema: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string minLength: 1 maxLength: 64 @@ -5393,8 +5467,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '204': description: 'There is no content to send for this request, but the headers may be useful. ' @@ -5453,8 +5527,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -5517,8 +5591,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -6235,7 +6309,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' responses: '200': description: The request has succeeded. @@ -6446,7 +6520,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: to in: query required: false @@ -6456,7 +6530,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' - name: windowSize in: query required: true @@ -6665,8 +6739,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH - name: at in: query required: false @@ -6674,7 +6748,7 @@ paths: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' explode: false responses: '200': @@ -6739,8 +6813,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -6815,8 +6889,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -6884,8 +6958,8 @@ paths: effectiveDate: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: If not provided the subscription is canceled immediately. + example: '2023-01-01T01:01:01.001Z' /api/v1/subscriptions/{subscriptionId}/change: post: operationId: changeSubscription @@ -6899,8 +6973,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -6975,8 +7049,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7055,8 +7129,8 @@ paths: required: true schema: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ + example: 01G65Z755AFWAKHE12NY0CQ9FH responses: '200': description: The request has succeeded. @@ -7227,9 +7301,9 @@ components: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH explode: false InvoiceListParams.expand: name: expand @@ -7267,7 +7341,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' explode: false InvoiceListParams.issuedBefore: name: issuedBefore @@ -7277,7 +7351,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' explode: false InvoiceListParams.statuses: name: statuses @@ -7368,7 +7442,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' MeterQuery.groupBy: name: groupBy in: query @@ -7400,7 +7474,7 @@ components: schema: type: string format: date-time - example: 2023-01-01T01:01:01.001Z + example: '2023-01-01T01:01:01.001Z' MeterQuery.windowSize: name: windowSize in: query @@ -7662,9 +7736,9 @@ components: Annotations: type: object additionalProperties: {} + description: Set of key-value pairs managed by the system. Cannot be modified by user. example: externalId: 019142cc-a016-796a-8113-1a942fecd26d - description: Set of key-value pairs managed by the system. Cannot be modified by user. App: anyOf: - $ref: '#/components/schemas/StripeApp' @@ -7690,9 +7764,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -7716,22 +7790,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true listing: @@ -7808,15 +7882,15 @@ components: description: type: string description: The capability description. + description: |- + App capability. + + Capabilities only exist in config so they don't extend the Resource model. example: type: collectPayments key: stripe_collect_payment name: Collect Payments description: Stripe payments collects outstanding revenue with Stripe customer's default payment method. - description: |- - App capability. - - Capabilities only exist in config so they don't extend the Resource model. AppCapabilityType: type: string enum: @@ -7859,9 +7933,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: |- App reference @@ -7895,14 +7969,14 @@ components: usage: type: number format: double - example: 100 description: The total usage of the feature in the period. + example: 100 readOnly: true balanceAtStart: type: number format: double - example: 100 description: The entitlement balance at the start of the period. + example: 100 readOnly: true description: The balance history window. BillingCollectionAlignment: @@ -7924,29 +7998,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ID of the charge or discount. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true percent: allOf: @@ -8027,9 +8101,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -8053,22 +8127,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true supplier: @@ -8148,27 +8222,27 @@ components: tax: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string description: The tax app used for this workflow x-go-type: string invoicing: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string description: The invoicing app used for this workflow x-go-type: string payment: anyOf: - type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH - type: string description: The payment app used for this workflow x-go-type: string @@ -8232,34 +8306,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true workflow: $ref: '#/components/schemas/BillingProfileCustomerWorkflowOverride' billingProfile: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The billing profile this override is associated with. If not provided, the default billing profile is chosen if available. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Customer specific workflow overrides. BillingProfileCustomerOverrideCreate: type: object @@ -8268,12 +8342,12 @@ components: $ref: '#/components/schemas/BillingProfileCustomerWorkflowOverrideCreate' billingProfile: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The billing profile this override is associated with. If not provided, the default billing profile is chosen if available. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Payload for creating a new or updating an existing customer override. BillingProfileCustomerOverrideOrderBy: type: string @@ -8290,16 +8364,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -8384,16 +8458,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -8502,12 +8576,12 @@ components: interval: type: string format: ISO8601 - example: P1D description: |- This grace period can be used to delay the collection of the pending line items specified in alignment. This is useful, in case of multiple subscriptions having slightly different billing periods. + example: P1D default: PT1H description: Workflow collection specifies how to collect the pending line items for an invoice BillingWorkflowCreate: @@ -8536,14 +8610,14 @@ components: draftPeriod: type: string format: ISO8601 - example: P1D description: The period for the invoice to be kept in draft status for manual reviews. + example: P1D default: P1D dueAfter: type: string format: ISO8601 - example: P1D description: The period after which the invoice is due. + example: P1D default: P7D progressiveBilling: type: boolean @@ -8621,13 +8695,13 @@ components: description: The request could not be completed due to a conflict with the current state of the target resource. CountryCode: type: string - example: US minLength: 2 maxLength: 2 pattern: ^[A-Z]{2}$ description: |- [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-2 country code. Custom two-letter country codes are also supported for convenience. + example: US CreateStripeCheckoutSessionRequest: type: object required: @@ -8636,9 +8710,9 @@ components: properties: appId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: If not provided, the default Stripe app is used if any. + example: 01G65Z755AFWAKHE12NY0CQ9FH customer: anyOf: - $ref: '#/components/schemas/CustomerId' @@ -8695,9 +8769,9 @@ components: properties: customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The OpenMeter customer ID. + example: 01G65Z755AFWAKHE12NY0CQ9FH stripeCustomerId: type: string description: The Stripe customer ID. @@ -8739,8 +8813,8 @@ components: issuedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: IssueAt reflects the time the document was issued. + example: '2023-01-01T01:01:01.001Z' readOnly: true number: allOf: @@ -8780,13 +8854,13 @@ components: description: Currency describes a currency supported by OpenMeter. CurrencyCode: type: string - example: USD minLength: 3 maxLength: 3 pattern: ^[A-Z]{3}$ description: |- Three-letter [ISO4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. Custom three-letter currency codes are also supported for convenience. + example: USD CustomPlanInput: type: object allOf: @@ -8840,8 +8914,8 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' customPlan: $ref: '#/components/schemas/CustomPlanInput' description: Change a custom subscription. @@ -8855,15 +8929,15 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' customPlan: $ref: '#/components/schemas/CustomPlanInput' customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Create a custom subscription. Customer: type: object @@ -8876,9 +8950,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -8902,22 +8976,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true usageAttribution: @@ -8945,20 +9019,20 @@ components: title: Billing Address currentSubscriptionId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The ID of the Subscription if the customer has one. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: Current Subscription ID readOnly: true + description: A customer object. example: id: 01G65Z755AFWAKHE12NY0CQ9FH name: ACME Inc. usageAttribution: subjectKeys: - my_subject_key - createdAt: 2024-01-01T01:01:01.001Z - updatedAt: 2024-01-01T01:01:01.001Z - description: A customer object. + createdAt: '2024-01-01T01:01:01.001Z' + updatedAt: '2024-01-01T01:01:01.001Z' CustomerAppData: anyOf: - $ref: '#/components/schemas/StripeCustomerAppData' @@ -8982,16 +9056,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -9053,9 +9127,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Create Stripe checkout session customer ID. CustomerOrderBy: type: string @@ -9074,16 +9148,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -9313,22 +9387,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -9338,18 +9412,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true type: allOf: @@ -9372,9 +9446,9 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV currentUsagePeriod: allOf: - $ref: '#/components/schemas/Period' @@ -9403,22 +9477,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -9428,18 +9502,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true subjectKey: type: string @@ -9457,9 +9531,9 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV currentUsagePeriod: allOf: - $ref: '#/components/schemas/Period' @@ -9487,11 +9561,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -9531,11 +9605,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -9559,34 +9633,33 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true amount: type: number format: double - example: 100 minimum: 0 description: The amount to grant. Should be a positive number. + example: 100 priority: type: integer format: uint8 - example: 1 minimum: 1 maximum: 255 description: |- @@ -9596,11 +9669,12 @@ components: When there are several grants available for the same subject, the system selects the grant with the highest priority. In cases where grants share the same priority level, the grant closest to its expiration will be used first. In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + example: 1 effectiveAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + example: '2023-01-01T01:01:01.001Z' expiration: allOf: - $ref: '#/components/schemas/ExpirationPeriod' @@ -9608,52 +9682,52 @@ components: maxRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 minRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 metadata: allOf: - $ref: '#/components/schemas/Metadata' + description: The grant metadata. example: stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB - description: The grant metadata. id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true entitlementId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV description: The unique entitlement ULID that the grant is associated with. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true nextRecurrence: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The next time the grant will recurr. + example: '2023-01-01T01:01:01.001Z' expiresAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the grant expires. + example: '2023-01-01T01:01:01.001Z' readOnly: true voidedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the grant was voided. + example: '2023-01-01T01:01:01.001Z' recurrence: allOf: - $ref: '#/components/schemas/RecurringPeriod' @@ -9669,13 +9743,12 @@ components: amount: type: number format: double - example: 100 minimum: 0 description: The amount to grant. Should be a positive number. + example: 100 priority: type: integer format: uint8 - example: 1 minimum: 1 maximum: 255 description: |- @@ -9685,11 +9758,12 @@ components: When there are several grants available for the same subject, the system selects the grant with the highest priority. In cases where grants share the same priority level, the grant closest to its expiration will be used first. In the case of two grants have identical priorities and expiration dates, the system will use the grant that was created first. + example: 1 effectiveAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). + example: '2023-01-01T01:01:01.001Z' expiration: allOf: - $ref: '#/components/schemas/ExpirationPeriod' @@ -9697,25 +9771,25 @@ components: maxRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 minRolloverAmount: type: number format: double - example: 100 description: |- Grants are rolled over at reset, after which they can have a different balance compared to what they had before the reset. Balance after the reset is calculated as: Balance_After_Reset = MIN(MaxRolloverAmount, MAX(Balance_Before_Reset, MinRolloverAmount)) + example: 100 default: 0 metadata: allOf: - $ref: '#/components/schemas/Metadata' + description: The grant metadata. example: stripePaymentId: pi_4OrAkhLvyihio9p51h9iiFnB - description: The grant metadata. recurrence: allOf: - $ref: '#/components/schemas/RecurringPeriodCreateInput' @@ -9777,22 +9851,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -9802,18 +9876,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true subjectKey: type: string @@ -9831,14 +9905,14 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV lastReset: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the last reset happened. + example: '2023-01-01T01:01:01.001Z' readOnly: true currentUsagePeriod: allOf: @@ -9848,8 +9922,8 @@ components: measureUsageFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + example: '2023-01-01T01:01:01.001Z' readOnly: true usagePeriod: allOf: @@ -9870,8 +9944,8 @@ components: lastReset: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time the last reset happened. + example: '2023-01-01T01:01:01.001Z' readOnly: true currentUsagePeriod: allOf: @@ -9881,8 +9955,8 @@ components: measureUsageFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time from which usage is measured. If not specified on creation, defaults to entitlement creation time. + example: '2023-01-01T01:01:01.001Z' readOnly: true usagePeriod: allOf: @@ -9907,11 +9981,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -9978,16 +10052,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -10014,27 +10088,27 @@ components: config: type: string format: json - example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + example: '{ "integrations": ["github"] }' createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true metadata: @@ -10044,18 +10118,18 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true subjectKey: type: string @@ -10073,9 +10147,9 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The feature the subject is entitled to use. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV currentUsagePeriod: allOf: - $ref: '#/components/schemas/Period' @@ -10102,11 +10176,11 @@ components: example: example-feature-key featureId: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The feature the subject is entitled to use. Either featureKey or featureId is required. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV metadata: allOf: - $ref: '#/components/schemas/Metadata' @@ -10122,8 +10196,8 @@ components: config: type: string format: json - example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + example: '{ "integrations": ["github"] }' description: Create inputs for static entitlement EntitlementType: type: string @@ -10140,31 +10214,31 @@ components: properties: hasAccess: type: boolean - example: true description: Whether the subject has access to the feature. Shared accross all entitlement types. + example: true readOnly: true balance: type: number format: double - example: 100 description: Only available for metered entitlements. Metered entitlements are built around a balance calculation where feature usage is deducted from the issued grants. Balance represents the remaining balance of the entitlement, it's value never turns negative. + example: 100 readOnly: true usage: type: number format: double - example: 50 description: Only available for metered entitlements. Returns the total feature usage in the current period. + example: 50 readOnly: true overage: type: number format: double - example: 0 description: Only available for metered entitlements. Overage represents the usage that wasn't covered by grants, e.g. if the subject had a total feature usage of 100 in the period but they were only granted 80, there would be 20 overage. + example: 0 readOnly: true config: type: string - example: '{ key: "value" }' description: Only available for static entitlements. The JSON parsable config of the entitlement. + example: '{ key: "value" }' readOnly: true description: Entitlements are the core of OpenMeter access management. They define access to features for subjects. Entitlements can be metered, boolean, or static. Event: @@ -10178,33 +10252,33 @@ components: properties: id: type: string - example: 5c10fade-1c9e-4d6c-8275-c52c36731d3c minLength: 1 description: Identifies the event. + example: 5c10fade-1c9e-4d6c-8275-c52c36731d3c source: type: string - example: service-name minLength: 1 format: uri-reference description: Identifies the context in which an event happened. + example: service-name specversion: type: string - example: '1.0' minLength: 1 description: The version of the CloudEvents specification which the event uses. + example: '1.0' default: '1.0' type: type: string - example: com.example.someevent minLength: 1 description: Contains a value describing the type of event related to the originating occurrence. + example: com.example.someevent datacontenttype: type: string enum: - application/json nullable: true - example: application/json description: Content type of the CloudEvents data value. Only the value "application/json" is allowed over HTTP. + example: application/json dataschema: type: string format: uri @@ -10213,14 +10287,14 @@ components: description: Identifies the schema that data adheres to. subject: type: string - example: customer-id minLength: 1 description: Describes the subject of the event in the context of the event producer (identified by source). + example: customer-id time: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp of when the occurrence happened. Must adhere to RFC 3339. + example: '2023-01-01T01:01:01.001Z' nullable: true data: type: object @@ -10229,18 +10303,18 @@ components: description: |- The event payload. Optional, if present it must be a JSON object. + description: |- + CloudEvents Specification JSON Schema + + Optional properties are nullable according to the CloudEvents specification: + OPTIONAL not omitted attributes MAY be represented as a null JSON value. example: id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c source: service-name specversion: '1.0' type: prompt subject: customer-id - time: 2023-01-01T01:01:01.001Z - description: |- - CloudEvents Specification JSON Schema - - Optional properties are nullable according to the CloudEvents specification: - OPTIONAL not omitted attributes MAY be represented as a null JSON value. + time: '2023-01-01T01:01:01.001Z' x-go-type-import: path: github.com/cloudevents/sdk-go/v2/event x-go-type: event.Event @@ -10265,8 +10339,8 @@ components: description: The unit of time for the expiration period. count: type: integer - example: 12 description: The number of time units in the expiration period. + example: 12 description: The grant expiration definition Feature: type: object @@ -10280,29 +10354,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true archivedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp of when the resource was archived. + example: '2023-01-01T01:01:01.001Z' title: Archival Time readOnly: true key: @@ -10318,35 +10392,35 @@ components: metadata: allOf: - $ref: '#/components/schemas/Metadata' + title: Optional metadata example: key: value - title: Optional metadata meterSlug: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A key is a unique string that is used to identify a resource. - example: tokens_total title: Meter slug + example: tokens_total meterGroupByFilters: type: object additionalProperties: type: string - example: - model: gpt-4 - type: input description: |- Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. Example scenario would be a meter tracking all token use with groupBy fields for the model, then the feature could filter for model=gpt-4. title: Meter group by filters + example: + model: gpt-4 + type: input id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Readonly unique ULID identifier. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV readOnly: true description: |- Represents a feature that can be enabled or disabled for a plan. @@ -10370,30 +10444,30 @@ components: metadata: allOf: - $ref: '#/components/schemas/Metadata' + title: Optional metadata example: key: value - title: Optional metadata meterSlug: type: string minLength: 1 maxLength: 64 pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$ description: A key is a unique string that is used to identify a resource. - example: tokens_total title: Meter slug + example: tokens_total meterGroupByFilters: type: object additionalProperties: type: string - example: - model: gpt-4 - type: input description: |- Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. Example scenario would be a meter tracking all token use with groupBy fields for the model, then the feature could filter for model=gpt-4. title: Meter group by filters + example: + model: gpt-4 + type: input description: |- Represents a feature that can be enabled or disabled for a plan. Used both for product catalog and entitlements. @@ -10405,17 +10479,17 @@ components: properties: id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Unique identifier of a feature. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Feature Unique Identifier key: type: string - example: gpt4_tokens description: |- The key is an immutable unique identifier of the feature used throughout the API, for example when interacting with a subject's entitlements. title: Feature Key + example: gpt4_tokens description: Limited representation of a feature resource which includes only its unique identifiers (id, key). FeatureOrderBy: type: string @@ -10434,16 +10508,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -10516,44 +10590,44 @@ components: usage: type: number format: double - example: 100 description: The total usage of the grant in the period. + example: 100 readOnly: true overage: type: number format: double - example: 100 description: Overuse that wasn't covered by grants. + example: 100 readOnly: true balanceAtStart: type: number format: double - example: 100 description: entitlement balance at the start of the period. + example: 100 readOnly: true grantBalancesAtStart: type: object additionalProperties: type: number format: double + description: 'The balance breakdown of each active grant at the start of the period: GrantID: Balance' example: 01G65Z755AFWAKHE12NY0CQ9FH: 100 - description: 'The balance breakdown of each active grant at the start of the period: GrantID: Balance' readOnly: true balanceAtEnd: type: number format: double - example: 100 description: The entitlement balance at the end of the period. + example: 100 readOnly: true grantBalancesAtEnd: type: object additionalProperties: type: number format: double + description: 'The balance breakdown of each active grant at the end of the period: GrantID: Balance' example: 01G65Z755AFWAKHE12NY0CQ9FH: 100 - description: 'The balance breakdown of each active grant at the end of the period: GrantID: Balance' readOnly: true grantUsages: type: array @@ -10582,16 +10656,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -10606,14 +10680,14 @@ components: properties: grantId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The id of the grant + example: 01G65Z755AFWAKHE12NY0CQ9FH usage: type: number format: double - example: 100 description: The usage in the period + example: 100 description: Usage Record IDResource: type: object @@ -10622,9 +10696,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true description: IDResource is a resouce with an ID. @@ -10654,13 +10728,14 @@ components: ingestedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time the event was ingested. + example: '2023-01-01T01:01:01.001Z' storedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time the event was stored. + example: '2023-01-01T01:01:01.001Z' + description: An ingested event with optional validation error. example: event: id: 5c10fade-1c9e-4d6c-8275-c52c36731d3c @@ -10668,10 +10743,9 @@ components: specversion: '1.0' type: prompt subject: customer-id - time: 2023-01-01T01:01:01.001Z - ingestedAt: 2023-01-01T01:01:01.001Z - storedAt: 2023-01-01T01:01:02.001Z - description: An ingested event with optional validation error. + time: '2023-01-01T01:01:01.001Z' + ingestedAt: '2023-01-01T01:01:01.001Z' + storedAt: '2023-01-01T01:01:02.001Z' InternalServerErrorProblemResponse: type: object allOf: @@ -10694,9 +10768,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true description: @@ -10714,22 +10788,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true type: @@ -10798,29 +10872,29 @@ components: issuedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time the invoice was issued. Depending on the status of the invoice this can mean multiple things: - draft, gathering: The time the invoice will be issued based on the workflow settings. - issued: The time the invoice was issued. + example: '2023-01-01T01:01:01.001Z' readOnly: true draftUntil: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time until the invoice is in draft status. On draft invoice creation it is calculated from the workflow settings. If manual approval is required, the draftUntil time is set. + example: '2023-01-01T01:01:01.001Z' dueAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Due time of the fulfillment of the invoice (if available). + example: '2023-01-01T01:01:01.001Z' readOnly: true period: allOf: @@ -10829,11 +10903,11 @@ components: voidedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time the invoice was voided. If the invoice was voided, this field will be set to the time the invoice was voided. + example: '2023-01-01T01:01:01.001Z' readOnly: true workflow: allOf: @@ -11009,29 +11083,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH status: allOf: - $ref: '#/components/schemas/InvoiceLineStatus' @@ -11100,8 +11174,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' externalIDs: allOf: - $ref: '#/components/schemas/InvoiceLineAppExternalIDs' @@ -11166,9 +11240,9 @@ components: title: Metadata id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH taxConfig: allOf: - $ref: '#/components/schemas/TaxConfig' @@ -11183,8 +11257,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11250,8 +11324,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11323,8 +11397,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11349,9 +11423,9 @@ components: default: regular customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer this line item belongs to. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceFlatFeePendingLineCreate represents the create model for an invoice line that is sold to the customer as a manually added fee. InvoiceGenericDocumentRef: type: object @@ -11410,29 +11484,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ID of the charge or discount. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true percent: allOf: @@ -11543,7 +11617,6 @@ components: description: TaxConfig stores the configuration for a tax line relative to an invoice line. InvoiceNumber: type: string - example: INV-2024-01-01-01 minLength: 1 maxLength: 256 description: |- @@ -11553,6 +11626,7 @@ components: The uniqueness depends on a lot of factors: - app setting (unique per app or unique per customer) - multiple app scenarios (multiple apps generating invoices with the same prefix) + example: INV-2024-01-01-01 InvoiceOrderBy: type: string enum: @@ -11572,16 +11646,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -11615,9 +11689,9 @@ components: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: |- The pending line items to include in the invoice, if not provided: - all line items that have invoice_at < asOf will be included @@ -11626,16 +11700,16 @@ components: asOf: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time as of which the invoice is created. If not provided, the current time is used. + example: '2023-01-01T01:01:01.001Z' customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer ID for which to create the invoice. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: |- BillingInvoiceActionInput is the input for creating an invoice. @@ -11648,9 +11722,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The ID of the invoice. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true number: allOf: @@ -11681,13 +11755,13 @@ components: draftUntil: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time until the invoice is in draft status. On draft invoice creation it is calculated from the workflow settings. If manual approval is required, the draftUntil time is set. + example: '2023-01-01T01:01:01.001Z' supplier: $ref: '#/components/schemas/BillingPartyReplaceUpdate' customer: @@ -11741,8 +11815,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11767,12 +11841,12 @@ components: default: regular id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- ID of the line. If not specified it will be auto-generated. When discounts are specified, this must be provided, so that the discount can reference it. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceSimulationFlatFeeLine represents a flat fee line item that can be input to the simulation endpoint. InvoiceSimulationInput: type: object @@ -11850,8 +11924,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -11874,12 +11948,12 @@ components: description: The quantity of the item used before this line's period, if the line is billed progressively. id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- ID of the line. If not specified it will be auto-generated. When discounts are specified, this must be provided, so that the discount can reference it. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceSimulationUsageBasedLine represents a usage-based line item that can be input to the simulation endpoint. InvoiceStatus: type: string @@ -12011,29 +12085,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH status: allOf: - $ref: '#/components/schemas/InvoiceLineStatus' @@ -12102,8 +12176,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' externalIDs: allOf: - $ref: '#/components/schemas/InvoiceLineAppExternalIDs' @@ -12171,9 +12245,9 @@ components: title: Metadata id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH taxConfig: allOf: - $ref: '#/components/schemas/TaxConfig' @@ -12188,8 +12262,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12245,8 +12319,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12308,8 +12382,8 @@ components: invoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time this line item should be invoiced. + example: '2023-01-01T01:01:01.001Z' type: type: string enum: @@ -12324,9 +12398,9 @@ components: description: The feature that the usage is based on. customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer this line item belongs to. + example: 01G65Z755AFWAKHE12NY0CQ9FH description: InvoiceUsageBasedLineCreateWithCustomer represents the create model for an invoice line that is sold to the customer based on usage. InvoiceWorkflowInvoicingSettingsReplaceUpdate: type: object @@ -12338,14 +12412,14 @@ components: draftPeriod: type: string format: ISO8601 - example: P1D description: The period for the invoice to be kept in draft status for manual reviews. + example: P1D default: P1D dueAfter: type: string format: ISO8601 - example: P1D description: The period after which the invoice is due. + example: P1D default: P7D description: InvoiceWorkflowInvoicingSettingsReplaceUpdate represents the update model for the invoicing settings of an invoice workflow. InvoiceWorkflowReplaceUpdate: @@ -12372,13 +12446,13 @@ components: readOnly: true sourceBillingProfileID: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- sourceBillingProfileID is the billing profile on which the workflow was based on. The profile is snapshotted on invoice creation, after which it can be altered independently of the profile itself. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true workflow: allOf: @@ -12471,6 +12545,11 @@ components: items: $ref: '#/components/schemas/AppCapability' description: The app's capabilities. + description: |- + A marketplace listing. + Represent an available app in the app marketplace that can be installed to the organization. + + Marketplace apps only exist in config so they don't extend the Resource model. example: type: stripe name: Stripe @@ -12488,11 +12567,6 @@ components: key: stripe_collect_payments name: Collect Payments description: Stripe payments collects outstanding revenue with Stripe customer's default payment method. - description: |- - A marketplace listing. - Represent an available app in the app marketplace that can be installed to the organization. - - Marketplace apps only exist in config so they don't extend the Resource model. MarketplaceListingList: type: object required: @@ -12536,17 +12610,17 @@ components: MeasureUsageFromTime: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' Metadata: type: object additionalProperties: type: string - example: - externalId: 019142cc-a016-796a-8113-1a942fecd26d description: |- Set of key-value pairs. Metadata can be used to store additional information about a resource. + example: + externalId: 019142cc-a016-796a-8113-1a942fecd26d x-go-type: map[string]string Meter: type: object @@ -12559,9 +12633,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the meter. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true slug: type: string @@ -12574,9 +12648,9 @@ components: example: tokens_total description: type: string - example: AI Token Usage minLength: 1 description: A description of the meter. + example: AI Token Usage aggregation: allOf: - $ref: '#/components/schemas/MeterAggregation' @@ -12587,12 +12661,11 @@ components: example: MINUTE eventType: type: string - example: prompt minLength: 1 description: The event type to aggregate. + example: prompt valueProperty: type: string - example: $.tokens minLength: 1 description: |- JSONPath expression to extract the value from the ingested event's data property. @@ -12600,18 +12673,20 @@ components: The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a string that can be parsed to a number. For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT aggregation the valueProperty is ignored. + example: $.tokens groupBy: type: object additionalProperties: type: string - example: - type: $.type description: |- Named JSONPath expressions to extract the group by values from the event data. Keys must be unique and consist only alphanumeric and underscore characters. TODO: add key format enforcement + example: + type: $.type + description: A meter is a configuration that defines how to match and aggregate events. example: id: 01G65Z755AFWAKHE12NY0CQ9FH slug: tokens_total @@ -12623,7 +12698,6 @@ components: groupBy: model: $.model type: $.type - description: A meter is a configuration that defines how to match and aggregate events. x-go-type-import: path: github.com/openmeterio/openmeter/pkg/models x-go-type: models.Meter @@ -12648,32 +12722,32 @@ components: from: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' to: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' windowSize: $ref: '#/components/schemas/WindowSize' data: type: array items: $ref: '#/components/schemas/MeterQueryRow' + description: The result of a meter query. example: - from: 2023-01-01T00:00:00Z - to: 2023-01-02T00:00:00Z + from: '2023-01-01T00:00:00Z' + to: '2023-01-02T00:00:00Z' windowSize: DAY data: - value: 12 - windowStart: 2023-01-01T00:00:00Z - windowEnd: 2023-01-02T00:00:00Z + windowStart: '2023-01-01T00:00:00Z' + windowEnd: '2023-01-02T00:00:00Z' subject: customer-1 groupBy: model: gpt-4-turbo type: prompt - description: The result of a meter query. MeterQueryRow: type: object required: @@ -12686,28 +12760,28 @@ components: windowStart: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' windowEnd: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' subject: type: string groupBy: type: object additionalProperties: type: string + description: A row in the result of a meter query. example: value: 12 - windowStart: 2023-01-01T00:00:00Z - windowEnd: 2023-01-02T00:00:00Z + windowStart: '2023-01-01T00:00:00Z' + windowEnd: '2023-01-02T00:00:00Z' subject: customer-1 groupBy: model: gpt-4-turbo type: prompt - description: A row in the result of a meter query. x-go-type-import: path: github.com/openmeterio/openmeter/pkg/models x-go-type: models.MeterQueryRow @@ -12739,9 +12813,9 @@ components: properties: id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification channel. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Channel Unique Identifier readOnly: true type: @@ -12769,16 +12843,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -12805,29 +12879,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification channel. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Channel Unique Identifier readOnly: true type: @@ -12838,20 +12912,20 @@ components: title: Channel Type name: type: string - example: customer-webhook description: User friendly name of the channel. title: Channel Name + example: customer-webhook disabled: type: boolean - example: true description: Whether the channel is disabled or not. title: Channel Disabled + example: true default: false url: type: string - example: https://example.com/webhook description: Webhook URL where the notification is sent. title: Webhook URL + example: https://example.com/webhook customHeaders: type: object additionalProperties: @@ -12860,13 +12934,13 @@ components: title: Custom HTTP Headers signingSecret: type: string - example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 pattern: ^(whsec_)?[a-zA-Z0-9+/=]{32,100}$ description: |- Signing secret used for webhook request validation on the receiving end. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24 title: Signing Secret + example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 description: Notification channel with webhook type. NotificationChannelWebhookCreateRequest: type: object @@ -12883,20 +12957,20 @@ components: title: Channel Type name: type: string - example: customer-webhook description: User friendly name of the channel. title: Channel Name + example: customer-webhook disabled: type: boolean - example: true description: Whether the channel is disabled or not. title: Channel Disabled + example: true default: false url: type: string - example: https://example.com/webhook description: Webhook URL where the notification is sent. title: Webhook URL + example: https://example.com/webhook customHeaders: type: object additionalProperties: @@ -12905,13 +12979,13 @@ components: title: Custom HTTP Headers signingSecret: type: string - example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 pattern: ^(whsec_)?[a-zA-Z0-9+/=]{32,100}$ description: |- Signing secret used for webhook request validation on the receiving end. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24 title: Signing Secret + example: whsec_S6g2HLnTwd9AhHwUIMFggVS9OfoPafN8 description: Request with input parameters for creating new notification channel with webhook type. NotificationEvent: type: object @@ -12925,9 +12999,9 @@ components: properties: id: type: string - example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier of the notification event. + example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 title: Event Identifier readOnly: true type: @@ -12939,8 +13013,8 @@ components: createdAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp when the notification event was created in RFC 3339 format. + example: '2023-01-01T01:01:01.001Z' title: Creation Time readOnly: true rule: @@ -12977,9 +13051,9 @@ components: properties: id: type: string - example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the notification event the payload belongs to. + example: 01J2KNP1YTXQRXHTDJ4KPR7PZ0 title: Notification Event Identifier readOnly: true type: @@ -12992,8 +13066,8 @@ components: timestamp: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp when the notification event was created in RFC 3339 format. + example: '2023-01-01T01:01:01.001Z' title: Creation Time readOnly: true data: @@ -13049,20 +13123,20 @@ components: state: allOf: - $ref: '#/components/schemas/NotificationEventDeliveryStatusState' - example: SUCCESS description: Delivery state of the notification event to the channel. + example: SUCCESS readOnly: true reason: type: string - example: Failed to dispatch event due to provider error. description: The reason of the last deliverry state update. title: State Reason + example: Failed to dispatch event due to provider error. readOnly: true updatedAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Timestamp of when the status was last updated in RFC 3339 format. + example: '2023-01-01T01:01:01.001Z' title: Last Update Time readOnly: true channel: @@ -13102,16 +13176,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13147,29 +13221,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification rule. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Rule Unique Identifier readOnly: true type: @@ -13180,14 +13254,14 @@ components: title: Rule Type name: type: string - example: Balance threshold reached description: The user friendly name of the notification rule. title: Rule Name + example: Balance threshold reached disabled: type: boolean - example: true description: Whether the rule is disabled or not. title: Rule Disabled + example: true default: false channels: type: array @@ -13227,14 +13301,14 @@ components: title: Rule Type name: type: string - example: Balance threshold reached description: The user friendly name of the notification rule. title: Rule Name + example: Balance threshold reached disabled: type: boolean - example: true description: Whether the rule is disabled or not. title: Rule Disabled + example: true default: false thresholds: type: array @@ -13248,9 +13322,9 @@ components: type: array items: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH minItems: 1 description: List of notification channels the rule is applied to. title: Channels @@ -13279,14 +13353,14 @@ components: value: type: number format: double - example: 100 description: Value of the threshold. title: Threshold Value + example: 100 type: allOf: - $ref: '#/components/schemas/NotificationRuleBalanceThresholdValueType' - example: NUMBER description: Type of the threshold. + example: NUMBER description: Threshold value with multiple supported types. NotificationRuleBalanceThresholdValueType: type: string @@ -13311,9 +13385,9 @@ components: properties: id: type: string - example: 01ARZ3NDEKTSV4RRFFQ69G5FAV pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: Identifies the notification rule. + example: 01ARZ3NDEKTSV4RRFFQ69G5FAV title: Rule Unique Identifier readOnly: true type: @@ -13341,16 +13415,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13381,8 +13455,8 @@ components: dueAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: When the payment is due. + example: '2023-01-01T01:01:01.001Z' readOnly: true notes: type: string @@ -13468,13 +13542,13 @@ components: from: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: Period start time. + example: '2023-01-01T01:01:01.001Z' to: type: string format: date-time - example: 2023-02-01T01:01:01.001Z description: Period end time. + example: '2023-02-01T01:01:01.001Z' description: A period with a start and end time. Plan: type: object @@ -13491,9 +13565,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -13517,22 +13591,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true key: @@ -13558,15 +13632,15 @@ components: effectiveFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time when the plan becomes effective. When not specified, the plan is a draft. + example: '2023-01-01T01:01:01.001Z' title: Effective start date readOnly: true effectiveTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The date and time when the plan is no longer effective. When not specified, the plan is effective indefinitely. + example: '2023-01-01T01:01:01.001Z' title: Effective end date readOnly: true status: @@ -13659,16 +13733,16 @@ components: properties: totalCount: type: integer - example: 500 description: The items in the current page. + example: 500 page: type: integer - example: 1 description: The items in the current page. + example: 1 pageSize: type: integer - example: 100 description: The items in the current page. + example: 100 items: type: array items: @@ -13712,9 +13786,9 @@ components: type: string format: duration nullable: true - example: P1Y description: The duration of the phase. title: Duration + example: P1Y rateCards: type: array items: @@ -13737,9 +13811,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The plan ID. + example: 01G65Z755AFWAKHE12NY0CQ9FH key: type: string minLength: 1 @@ -13821,8 +13895,8 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' name: type: string description: @@ -13843,17 +13917,17 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' name: type: string description: type: string customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Create subscription based on plan. PlanVariant: type: object @@ -13873,10 +13947,10 @@ components: variant: allOf: - $ref: '#/components/schemas/PlanVariant' - example: - currency: USD description: The variant of the plan. title: Variant + example: + currency: USD currency: allOf: - $ref: '#/components/schemas/CurrencyCode' @@ -13916,9 +13990,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true subject: type: string @@ -13926,8 +14000,8 @@ components: expiresAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' readOnly: true expired: type: boolean @@ -13935,21 +14009,21 @@ components: createdAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T01:01:01.001Z' readOnly: true token: type: string - example: om_portal_IAnD3PpWW2A2Wr8m9jfzeHlGX8xmCXwG.y5q4S-AWqFu6qjfaFz0zQq4Ez28RsnyVwJffX5qxMvo description: The token is only returned at creation. + example: om_portal_IAnD3PpWW2A2Wr8m9jfzeHlGX8xmCXwG.y5q4S-AWqFu6qjfaFz0zQq4Ez28RsnyVwJffX5qxMvo readOnly: true allowedMeterSlugs: type: array items: type: string + description: Optional, if defined only the specified meters will be allowed. example: - tokens_total - description: Optional, if defined only the specified meters will be allowed. description: |- A consumer portal token. @@ -14130,11 +14204,14 @@ components: allOf: - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' nullable: true - example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price + example: + type: flat + amount: '100' + paymentTerm: in_arrears description: A flat fee rate card defines a one-time purchase or a recurring fee. RateCardMeteredEntitlement: type: object @@ -14212,11 +14289,14 @@ components: allOf: - $ref: '#/components/schemas/FlatPriceWithPaymentTerm' nullable: true - example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price + example: + type: flat + amount: '100' + paymentTerm: in_arrears description: Flat fee rate card override. RateCardOverrideUsageBased: type: object @@ -14255,8 +14335,8 @@ components: config: type: string format: json - example: '{ "integrations": ["github"] }' description: The JSON parsable config of the entitlement. This value is also returned when checking entitlement access and it is useful for configuring fine-grained access settings to the feature, implemented in your own system. Has to be an object. + example: '{ "integrations": ["github"] }' description: Entitlement template of a static entitlement. RateCardType: type: string @@ -14368,14 +14448,14 @@ components: anchor: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: A date-time anchor to base the recurring period on. + example: '2023-01-01T01:01:01.001Z' title: Anchor time + description: Recurring period with an interval and an anchor. example: interval: DAY intervalISO: P1D - anchor: 2023-01-01T01:01:01.001Z - description: Recurring period with an interval and an anchor. + anchor: '2023-01-01T01:01:01.001Z' RecurringPeriodCreateInput: type: object required: @@ -14389,13 +14469,13 @@ components: anchor: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: A date-time anchor to base the recurring period on. + example: '2023-01-01T01:01:01.001Z' title: Anchor time + description: Recurring period with an interval and an anchor. example: interval: DAY - anchor: 2023-01-01T01:01:01.001Z - description: Recurring period with an interval and an anchor. + anchor: '2023-01-01T01:01:01.001Z' RecurringPeriodInterval: anyOf: - type: string @@ -14424,8 +14504,8 @@ components: effectiveAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time at which the reset takes effect, defaults to now. The reset cannot be in the future. The provided value is truncated to the minute due to how historical meter data is stored. + example: '2023-01-01T01:01:01.001Z' retainAnchor: type: boolean description: |- @@ -14453,9 +14533,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -14479,22 +14559,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true listing: @@ -14534,11 +14614,11 @@ components: readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The app ID. If not provided, it will use the global default for the app type. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: App ID type: type: string @@ -14601,9 +14681,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -14627,22 +14707,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true listing: @@ -14676,6 +14756,7 @@ components: description: |- The masked API key. Only shows the first 8 and last 3 characters. + description: A installed Stripe app object. example: id: 01G65Z755AFWAKHE12NY0CQ9FH type: stripe @@ -14699,12 +14780,11 @@ components: key: stripe_collect_payments name: Collect Payments description: Stripe payments collects outstanding revenue with Stripe customer's default payment method. - createdAt: 2024-01-01T01:01:01.001Z - updatedAt: 2024-01-01T01:01:01.001Z + createdAt: '2024-01-01T01:01:01.001Z' + updatedAt: '2024-01-01T01:01:01.001Z' stripeAccountId: acct_123456789 livemode: true maskedAPIKey: sk_live_************abc - description: A installed Stripe app object. StripeCheckoutSessionMode: type: string enum: @@ -14718,11 +14798,11 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: |- The app ID. If not provided, it will use the global default for the app type. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: App ID type: type: string @@ -14741,10 +14821,10 @@ components: stripeDefaultPaymentMethodId: type: string description: The Stripe default payment method ID. + description: Stripe Customer App Data. example: type: stripe stripeCustomerId: cus_xxxxxxxxxxxxxx - description: Stripe Customer App Data. StripePaymentIntentStatus: type: string enum: @@ -14794,13 +14874,13 @@ components: properties: code: type: string - example: txcd_10000000 pattern: ^txcd_\d{8}$ description: |- Product tax code. See: https://docs.stripe.com/tax/tax-codes title: Tax code + example: txcd_10000000 description: The tax config for Stripe. StripeWebhookEvent: type: object @@ -14841,19 +14921,19 @@ components: properties: namespaceId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH appId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ULID (Universally Unique Lexicographically Sortable Identifier). + example: 01G65Z755AFWAKHE12NY0CQ9FH description: Stripe webhook response. Subject: type: object @@ -14863,48 +14943,49 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the subject. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true key: type: string - example: customer-id description: A unique, human-readable identifier for the subject. + example: customer-id displayName: type: string nullable: true - example: Customer Name description: A human-readable display name for the subject. + example: Customer Name metadata: type: object additionalProperties: {} nullable: true - example: {} + example: + hubspotId: '123456' currentPeriodStart: type: string format: date-time - example: 2023-01-01T00:00:00Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-01-01T00:00:00Z' currentPeriodEnd: type: string format: date-time - example: 2023-02-01T00:00:00Z description: '[RFC3339](https://tools.ietf.org/html/rfc3339) formatted date-time string in UTC.' + example: '2023-02-01T00:00:00Z' stripeCustomerId: type: string nullable: true example: cus_JMOlctsKV8 + description: A subject is a unique identifier for a user or entity. example: id: 01G65Z755AFWAKHE12NY0CQ9FH key: customer-id displayName: Customer Name metadata: hubspotId: '123456' - currentPeriodStart: 2023-01-01T00:00:00Z - currentPeriodEnd: 2023-02-01T00:00:00Z + currentPeriodStart: '2023-01-01T00:00:00Z' + currentPeriodEnd: '2023-02-01T00:00:00Z' stripeCustomerId: cus_JMOlctsKV8 - description: A subject is a unique identifier for a user or entity. Subscription: type: object required: @@ -14919,9 +15000,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -14945,34 +15026,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' status: allOf: - $ref: '#/components/schemas/SubscriptionStatus' @@ -14980,9 +15061,9 @@ components: readOnly: true customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer ID of the subscription. + example: 01G65Z755AFWAKHE12NY0CQ9FH plan: allOf: - $ref: '#/components/schemas/PlanReference' @@ -15065,9 +15146,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15091,34 +15172,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' status: allOf: - $ref: '#/components/schemas/SubscriptionStatus' @@ -15126,9 +15207,9 @@ components: readOnly: true customerId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The customer ID of the subscription. + example: 01G65Z755AFWAKHE12NY0CQ9FH plan: allOf: - $ref: '#/components/schemas/PlanReference' @@ -15160,9 +15241,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15186,34 +15267,34 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence start of the resource. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The cadence end of the resource. + example: '2023-01-01T01:01:01.001Z' key: type: string minLength: 1 @@ -15258,11 +15339,14 @@ components: allOf: - $ref: '#/components/schemas/TieredPriceWithCommitments' nullable: true - example: {} description: |- The price of the rate card. When null, the feature or service is free. title: Price + example: + type: flat + amount: '100' + paymentTerm: in_arrears included: allOf: - $ref: '#/components/schemas/SubscriptionItemIncluded' @@ -15301,9 +15385,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15327,22 +15411,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true key: @@ -15360,13 +15444,13 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time from which the phase is active. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The until which the Phase is active. + example: '2023-01-01T01:01:01.001Z' description: Subscription phase, analogous to plan phases. SubscriptionPhaseCreate: type: object @@ -15379,19 +15463,19 @@ components: type: string format: duration nullable: true - example: P1Y description: |- Interval after the subscription starts to transition to the phase. When null, the phase starts immediately after the subscription starts. title: Start after + example: P1Y duration: type: string format: duration - example: P1M description: |- The intended duration of the new phase. Duration is required when the phase will not be the last phase. title: Duration + example: P1M discounts: type: array items: @@ -15424,9 +15508,9 @@ components: properties: id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: A unique identifier for the resource. + example: 01G65Z755AFWAKHE12NY0CQ9FH title: ID readOnly: true name: @@ -15450,22 +15534,22 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true key: @@ -15483,13 +15567,13 @@ components: activeFrom: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The time from which the phase is active. + example: '2023-01-01T01:01:01.001Z' activeTo: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: The until which the Phase is active. + example: '2023-01-01T01:01:01.001Z' items: type: array items: @@ -15626,29 +15710,29 @@ components: type: type: string format: uri - example: about:blank description: Type contains a URI that identifies the problem type. + example: about:blank default: about:blank title: type: string - example: Bad Request description: A a short, human-readable summary of the problem type. + example: Bad Request status: type: integer format: int16 - example: 400 minimum: 400 maximum: 599 description: The HTTP status code generated by the origin server for this occurrence of the problem. + example: 400 detail: type: string - example: The request body must be a JSON object. description: A human-readable explanation specific to this occurrence of the problem. + example: The request body must be a JSON object. instance: type: string format: uri - example: urn:request:local/JMOlctsKV8-000001 description: A URI reference that identifies the specific occurrence of the problem. + example: urn:request:local/JMOlctsKV8-000001 additionalProperties: anyOf: - type: string @@ -15712,29 +15796,29 @@ components: createdAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was created. + example: '2024-01-01T01:01:01.001Z' title: Creation Time readOnly: true updatedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was last updated. + example: '2024-01-01T01:01:01.001Z' title: Last Update Time readOnly: true deletedAt: type: string format: date-time - example: 2024-01-01T01:01:01.001Z description: Timestamp of when the resource was permanently deleted. + example: '2024-01-01T01:01:01.001Z' title: Deletion Time readOnly: true id: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: ID of the charge or discount. + example: 01G65Z755AFWAKHE12NY0CQ9FH readOnly: true severity: allOf: @@ -15832,9 +15916,9 @@ components: properties: lineId: type: string - example: 01G65Z755AFWAKHE12NY0CQ9FH pattern: ^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$ description: The line item ID to override. + example: 01G65Z755AFWAKHE12NY0CQ9FH action: allOf: - $ref: '#/components/schemas/VoidInvoiceActionCreateItem' @@ -15888,11 +15972,11 @@ components: nextInvoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time at which the line item should be invoiced again. If not provided, the line item will be re-invoiced now. + example: '2023-01-01T01:01:01.001Z' description: VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. VoidInvoiceLinePendingActionCreateItem: type: object @@ -15906,11 +15990,11 @@ components: nextInvoiceAt: type: string format: date-time - example: 2023-01-01T01:01:01.001Z description: |- The time at which the line item should be invoiced again. If not provided, the line item will be re-invoiced now. + example: '2023-01-01T01:01:01.001Z' description: VoidInvoiceLinePendingAction describes how to handle the voidied line item in the invoice. WindowSize: type: string diff --git a/api/spec/src/customer.tsp b/api/spec/src/customer.tsp index 2747d6dde..54ffdf714 100644 --- a/api/spec/src/customer.tsp +++ b/api/spec/src/customer.tsp @@ -103,6 +103,19 @@ interface Customers { deleteAppData(@path customerId: ULID, @path appId: ULID): { @statusCode _: 204; } | NotFoundError | CommonErrors; + + /** + * Checks customer access to a given feature (by key). All entitlement types share the hasAccess property in their value response, but multiple other properties are returned based on the entitlement type. + */ + @get + @operationId("getCustomerEntitlementValue") + @route("/{customerId}/entitlements/{featureKey}/value") + @summary("Get entitlement value") + getCustomerEntitlementValue( + @path customerId: string, + @path featureKey: string, + @query(#{ explode: true }) time?: DateTime, + ): Entitlements.EntitlementValue | OpenMeter.CommonErrors | OpenMeter.NotFoundError; } /** diff --git a/api/spec/src/entitlements/subjects.tsp b/api/spec/src/entitlements/subjects.tsp index 4ff792e41..9bd20d841 100644 --- a/api/spec/src/entitlements/subjects.tsp +++ b/api/spec/src/entitlements/subjects.tsp @@ -6,7 +6,6 @@ using TypeSpec.Http; using TypeSpec.Rest; using TypeSpec.OpenAPI; -// TODO: does this have to be in a separate namespace? namespace OpenMeter.Entitlements; @route("/api/v1/subjects/{subjectIdOrKey}/entitlements") diff --git a/app/common/customer.go b/app/common/customer.go index 1bba375be..a11035fee 100644 --- a/app/common/customer.go +++ b/app/common/customer.go @@ -10,13 +10,14 @@ import ( customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" + "github.com/openmeterio/openmeter/openmeter/registry" ) var Customer = wire.NewSet( NewCustomerService, ) -func NewCustomerService(logger *slog.Logger, db *entdb.Client) (customer.Service, error) { +func NewCustomerService(logger *slog.Logger, db *entdb.Client, entRegistry *registry.Entitlement) (customer.Service, error) { customerAdapter, err := customeradapter.New(customeradapter.Config{ Client: db, Logger: logger.WithGroup("customer.postgres"), @@ -26,6 +27,7 @@ func NewCustomerService(logger *slog.Logger, db *entdb.Client) (customer.Service } return customerservice.New(customerservice.Config{ - Adapter: customerAdapter, + Adapter: customerAdapter, + EntitlementConnector: entRegistry.Entitlement, }) } diff --git a/cmd/billing-worker/wire_gen.go b/cmd/billing-worker/wire_gen.go index 06f18911e..2e8b06499 100644 --- a/cmd/billing-worker/wire_gen.go +++ b/cmd/billing-worker/wire_gen.go @@ -148,7 +148,10 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - customerService, err := common.NewCustomerService(logger, client) + entitlementsConfiguration := conf.Entitlements + aggregationConfiguration := conf.Aggregation + clickHouseAggregationConfiguration := aggregationConfiguration.ClickHouse + v2, err := common.NewClickHouse(clickHouseAggregationConfiguration) if err != nil { cleanup6() cleanup5() @@ -158,7 +161,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - secretserviceService, err := common.NewUnsafeSecretService(logger, client) + v3 := conf.Meters + inMemoryRepository := common.NewInMemoryRepository(v3) + connector, err := common.NewStreamingConnector(ctx, aggregationConfiguration, v2, inMemoryRepository, logger) if err != nil { cleanup6() cleanup5() @@ -168,7 +173,8 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - appstripeService, err := common.NewAppStripeService(logger, client, appsConfiguration, service, customerService, secretserviceService) + entitlement := common.NewEntitlementRegistry(logger, client, entitlementsConfiguration, connector, inMemoryRepository, eventbusPublisher) + customerService, err := common.NewCustomerService(logger, client, entitlement) if err != nil { cleanup6() cleanup5() @@ -178,7 +184,7 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - adapter, err := common.BillingAdapter(logger, client) + secretserviceService, err := common.NewUnsafeSecretService(logger, client) if err != nil { cleanup6() cleanup5() @@ -188,12 +194,7 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - v2 := conf.Meters - inMemoryRepository := common.NewInMemoryRepository(v2) - featureConnector := common.NewFeatureConnector(logger, client, inMemoryRepository) - aggregationConfiguration := conf.Aggregation - clickHouseAggregationConfiguration := aggregationConfiguration.ClickHouse - v3, err := common.NewClickHouse(clickHouseAggregationConfiguration) + appstripeService, err := common.NewAppStripeService(logger, client, appsConfiguration, service, customerService, secretserviceService) if err != nil { cleanup6() cleanup5() @@ -203,7 +204,7 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - connector, err := common.NewStreamingConnector(ctx, aggregationConfiguration, v3, inMemoryRepository, logger) + adapter, err := common.BillingAdapter(logger, client) if err != nil { cleanup6() cleanup5() @@ -213,6 +214,7 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } + featureConnector := common.NewFeatureConnector(logger, client, inMemoryRepository) billingService, err := common.BillingService(logger, client, service, appstripeService, adapter, billingConfiguration, customerService, featureConnector, inMemoryRepository, connector, eventbusPublisher) if err != nil { cleanup6() @@ -224,8 +226,6 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl return Application{}, nil, err } productCatalogConfiguration := conf.ProductCatalog - entitlementsConfiguration := conf.Entitlements - entitlement := common.NewEntitlementRegistry(logger, client, entitlementsConfiguration, connector, inMemoryRepository, eventbusPublisher) planService, err := common.NewPlanService(logger, client, productCatalogConfiguration, featureConnector) if err != nil { cleanup6() diff --git a/cmd/jobs/billing/advance/advance.go b/cmd/jobs/billing/advance/advance.go index 44cfd4346..616ffd69d 100644 --- a/cmd/jobs/billing/advance/advance.go +++ b/cmd/jobs/billing/advance/advance.go @@ -15,6 +15,7 @@ import ( billingadapter "github.com/openmeterio/openmeter/openmeter/billing/adapter" billingservice "github.com/openmeterio/openmeter/openmeter/billing/service" billingworkerautoadvance "github.com/openmeterio/openmeter/openmeter/billing/worker/advance" + registrybuilder "github.com/openmeterio/openmeter/openmeter/registry/builder" "github.com/openmeterio/openmeter/openmeter/watermill/driver/kafka" "github.com/openmeterio/openmeter/pkg/framework/entutils/entdriver" "github.com/openmeterio/openmeter/pkg/framework/pgdriver" @@ -57,40 +58,8 @@ func NewAutoAdvancer(ctx context.Context, conf appconfig.Configuration, logger * // Initialize Ent driver entPostgresDriver := entdriver.NewEntPostgresDriver(postgresDriver.DB()) - customerService, err := common.NewCustomerService(logger, entPostgresDriver.Client()) - if err != nil { - return nil, fmt.Errorf("failed to initialize customer service: %w", err) - } - - secretService, err := common.NewUnsafeSecretService(logger, entPostgresDriver.Client()) - if err != nil { - return nil, fmt.Errorf("failed to initialize secret service: %w", err) - } - - appService, err := common.NewAppService(logger, entPostgresDriver.Client(), conf.Apps) - if err != nil { - return nil, fmt.Errorf("failed to initialize app service: %w", err) - } - - _, err = common.NewAppStripeService(logger, entPostgresDriver.Client(), conf.Apps, appService, customerService, secretService) - if err != nil { - return nil, fmt.Errorf("failed to initialize stripe app service: %w", err) - } - - namespaceManager, err := common.NewNamespaceManager(nil, conf.Namespace) - if err != nil { - return nil, fmt.Errorf("failed to initialize namespace manager: %w", err) - } - - _, err = common.NewAppSandboxProvisioner(ctx, logger, conf.Apps, appService, namespaceManager) - if err != nil { - return nil, fmt.Errorf("failed to initialize sandbox app provisioner: %w", err) - } - meterRepository := common.NewInMemoryRepository(conf.Meters) - featureService := common.NewFeatureConnector(logger, entPostgresDriver.Client(), meterRepository) - clickhouseConn, err := common.NewClickHouse(conf.Aggregation.ClickHouse) if err != nil { return nil, fmt.Errorf("failed to initialize clickhouse connection: %w", err) @@ -129,6 +98,44 @@ func NewAutoAdvancer(ctx context.Context, conf appconfig.Configuration, logger * return nil, fmt.Errorf("failed to initialize event bus publisher: %w", err) } + entitlementRegistry := registrybuilder.GetEntitlementRegistry(registrybuilder.EntitlementOptions{ + DatabaseClient: entPostgresDriver.Client(), + StreamingConnector: streamingConnector, + Logger: logger, + MeterRepository: meterRepository, + Publisher: ebPublisher, + }) + + customerService, err := common.NewCustomerService(logger, entPostgresDriver.Client(), entitlementRegistry) + if err != nil { + return nil, fmt.Errorf("failed to initialize customer service: %w", err) + } + + secretService, err := common.NewUnsafeSecretService(logger, entPostgresDriver.Client()) + if err != nil { + return nil, fmt.Errorf("failed to initialize secret service: %w", err) + } + + appService, err := common.NewAppService(logger, entPostgresDriver.Client(), conf.Apps) + if err != nil { + return nil, fmt.Errorf("failed to initialize app service: %w", err) + } + + _, err = common.NewAppStripeService(logger, entPostgresDriver.Client(), conf.Apps, appService, customerService, secretService) + if err != nil { + return nil, fmt.Errorf("failed to initialize stripe app service: %w", err) + } + + namespaceManager, err := common.NewNamespaceManager(nil, conf.Namespace) + if err != nil { + return nil, fmt.Errorf("failed to initialize namespace manager: %w", err) + } + + _, err = common.NewAppSandboxProvisioner(ctx, logger, conf.Apps, appService, namespaceManager) + if err != nil { + return nil, fmt.Errorf("failed to initialize sandbox app provisioner: %w", err) + } + billingAdapter, err := billingadapter.New(billingadapter.Config{ Client: entPostgresDriver.Client(), Logger: logger, @@ -142,7 +149,7 @@ func NewAutoAdvancer(ctx context.Context, conf appconfig.Configuration, logger * CustomerService: customerService, AppService: appService, Logger: logger, - FeatureService: featureService, + FeatureService: entitlementRegistry.Feature, MeterRepo: meterRepository, StreamingConnector: streamingConnector, Publisher: ebPublisher, diff --git a/cmd/server/wire_gen.go b/cmd/server/wire_gen.go index 8c3af20b4..2706976e7 100644 --- a/cmd/server/wire_gen.go +++ b/cmd/server/wire_gen.go @@ -92,7 +92,10 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - customerService, err := common.NewCustomerService(logger, client) + entitlementsConfiguration := conf.Entitlements + aggregationConfiguration := conf.Aggregation + clickHouseAggregationConfiguration := aggregationConfiguration.ClickHouse + v, err := common.NewClickHouse(clickHouseAggregationConfiguration) if err != nil { cleanup5() cleanup4() @@ -101,7 +104,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - secretserviceService, err := common.NewUnsafeSecretService(logger, client) + v2 := conf.Meters + inMemoryRepository := common.NewInMemoryRepository(v2) + connector, err := common.NewStreamingConnector(ctx, aggregationConfiguration, v, inMemoryRepository, logger) if err != nil { cleanup5() cleanup4() @@ -110,7 +115,13 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - appstripeService, err := common.NewAppStripeService(logger, client, appsConfiguration, service, customerService, secretserviceService) + ingestConfiguration := conf.Ingest + kafkaIngestConfiguration := ingestConfiguration.Kafka + kafkaConfiguration := kafkaIngestConfiguration.KafkaConfiguration + brokerOptions := common.NewBrokerConfiguration(kafkaConfiguration, logTelemetryConfig, commonMetadata, logger, meter) + eventsConfiguration := conf.Events + v3 := common.ServerProvisionTopics(eventsConfiguration) + adminClient, err := common.NewKafkaAdminClient(kafkaConfiguration) if err != nil { cleanup5() cleanup4() @@ -119,9 +130,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - ingestConfiguration := conf.Ingest - kafkaIngestConfiguration := ingestConfiguration.Kafka - namespacedTopicResolver, err := common.NewNamespacedTopicResolver(kafkaIngestConfiguration) + topicProvisionerConfig := kafkaIngestConfiguration.TopicProvisionerConfig + kafkaTopicProvisionerConfig := common.NewKafkaTopicProvisionerConfig(adminClient, logger, meter, topicProvisionerConfig) + topicProvisioner, err := common.NewKafkaTopicProvisioner(kafkaTopicProvisionerConfig) if err != nil { cleanup5() cleanup4() @@ -130,8 +141,12 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - kafkaConfiguration := kafkaIngestConfiguration.KafkaConfiguration - adminClient, err := common.NewKafkaAdminClient(kafkaConfiguration) + publisherOptions := kafka.PublisherOptions{ + Broker: brokerOptions, + ProvisionTopics: v3, + TopicProvisioner: topicProvisioner, + } + publisher, cleanup6, err := common.NewServerPublisher(ctx, publisherOptions, logger) if err != nil { cleanup5() cleanup4() @@ -140,10 +155,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - topicProvisionerConfig := kafkaIngestConfiguration.TopicProvisionerConfig - kafkaTopicProvisionerConfig := common.NewKafkaTopicProvisionerConfig(adminClient, logger, meter, topicProvisionerConfig) - topicProvisioner, err := common.NewKafkaTopicProvisioner(kafkaTopicProvisionerConfig) + eventbusPublisher, err := common.NewEventBusPublisher(publisher, eventsConfiguration, logger) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -151,8 +165,10 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - namespaceHandler, err := common.NewKafkaNamespaceHandler(namespacedTopicResolver, topicProvisioner, kafkaIngestConfiguration) + entitlement := common.NewEntitlementRegistry(logger, client, entitlementsConfiguration, connector, inMemoryRepository, eventbusPublisher) + customerService, err := common.NewCustomerService(logger, client, entitlement) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -160,10 +176,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - aggregationConfiguration := conf.Aggregation - clickHouseAggregationConfiguration := aggregationConfiguration.ClickHouse - v, err := common.NewClickHouse(clickHouseAggregationConfiguration) + secretserviceService, err := common.NewUnsafeSecretService(logger, client) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -171,10 +186,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - v2 := conf.Meters - inMemoryRepository := common.NewInMemoryRepository(v2) - connector, err := common.NewStreamingConnector(ctx, aggregationConfiguration, v, inMemoryRepository, logger) + appstripeService, err := common.NewAppStripeService(logger, client, appsConfiguration, service, customerService, secretserviceService) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -182,10 +196,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - v3 := common.NewNamespaceHandlers(namespaceHandler, connector) - namespaceConfiguration := conf.Namespace - manager, err := common.NewNamespaceManager(v3, namespaceConfiguration) + namespacedTopicResolver, err := common.NewNamespacedTopicResolver(kafkaIngestConfiguration) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -193,8 +206,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - appSandboxProvisioner, err := common.NewAppSandboxProvisioner(ctx, logger, appsConfiguration, service, manager) + namespaceHandler, err := common.NewKafkaNamespaceHandler(namespacedTopicResolver, topicProvisioner, kafkaIngestConfiguration) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -202,8 +216,11 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - adapter, err := common.BillingAdapter(logger, client) + v4 := common.NewNamespaceHandlers(namespaceHandler, connector) + namespaceConfiguration := conf.Namespace + manager, err := common.NewNamespaceManager(v4, namespaceConfiguration) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -211,18 +228,9 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - billingConfiguration := conf.Billing - featureConnector := common.NewFeatureConnector(logger, client, inMemoryRepository) - brokerOptions := common.NewBrokerConfiguration(kafkaConfiguration, logTelemetryConfig, commonMetadata, logger, meter) - eventsConfiguration := conf.Events - v4 := common.ServerProvisionTopics(eventsConfiguration) - publisherOptions := kafka.PublisherOptions{ - Broker: brokerOptions, - ProvisionTopics: v4, - TopicProvisioner: topicProvisioner, - } - publisher, cleanup6, err := common.NewServerPublisher(ctx, publisherOptions, logger) + appSandboxProvisioner, err := common.NewAppSandboxProvisioner(ctx, logger, appsConfiguration, service, manager) if err != nil { + cleanup6() cleanup5() cleanup4() cleanup3() @@ -230,7 +238,7 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - eventbusPublisher, err := common.NewEventBusPublisher(publisher, eventsConfiguration, logger) + adapter, err := common.BillingAdapter(logger, client) if err != nil { cleanup6() cleanup5() @@ -240,6 +248,8 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } + billingConfiguration := conf.Billing + featureConnector := common.NewFeatureConnector(logger, client, inMemoryRepository) billingService, err := common.BillingService(logger, client, service, appstripeService, adapter, billingConfiguration, customerService, featureConnector, inMemoryRepository, connector, eventbusPublisher) if err != nil { cleanup6() @@ -250,8 +260,6 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl cleanup() return Application{}, nil, err } - entitlementsConfiguration := conf.Entitlements - entitlement := common.NewEntitlementRegistry(logger, client, entitlementsConfiguration, connector, inMemoryRepository, eventbusPublisher) producer, err := common.NewKafkaProducer(kafkaIngestConfiguration, logger) if err != nil { cleanup6() @@ -361,7 +369,7 @@ func initializeApplication(ctx context.Context, conf config.Configuration) (Appl KafkaMetrics: metrics, Logger: logger, MeterRepository: inMemoryRepository, - NamespaceHandlers: v3, + NamespaceHandlers: v4, NamespaceManager: manager, Notification: notificationService, Meter: meter, diff --git a/e2e/productcatalog_test.go b/e2e/productcatalog_test.go index a9b82406f..3eb5be994 100644 --- a/e2e/productcatalog_test.go +++ b/e2e/productcatalog_test.go @@ -1,6 +1,7 @@ package e2e import ( + "net/http" "testing" "time" @@ -114,12 +115,19 @@ func TestPlan(t *testing.T) { }) require.Nil(t, err) + et := &api.RateCardEntitlement{} + err = et.FromRateCardBooleanEntitlement(api.RateCardBooleanEntitlement{ + Type: api.RateCardBooleanEntitlementType("boolean"), + }) + require.Nil(t, err) + p1RC2 := api.RateCard{} err = p1RC2.FromRateCardFlatFee(api.RateCardFlatFee{ - Name: "Test Plan Phase 1 Rate Card 2", - Description: lo.ToPtr("Has a monthly recurring price to grant access to a feature"), - Key: PlanFeatureKey, - FeatureKey: lo.ToPtr(PlanFeatureKey), + Name: "Test Plan Phase 1 Rate Card 2", + Description: lo.ToPtr("Has a monthly recurring price to grant access to a feature"), + Key: PlanFeatureKey, + FeatureKey: lo.ToPtr(PlanFeatureKey), + EntitlementTemplate: et, TaxConfig: &api.TaxConfig{ Stripe: &api.StripeTaxConfig{ Code: "txcd_10000000", @@ -526,4 +534,14 @@ func TestPlan(t *testing.T) { require.Equal(t, 1, len(apiRes.JSON200.Items)) require.Equal(t, *customer1.Id, *apiRes.JSON200.Items[0].Id) }) + + t.Run("Should check entitlement of customer", func(t *testing.T) { + res, err := client.GetCustomerEntitlementValueWithResponse(ctx, *customer1.Id, PlanFeatureKey, nil) + require.Nil(t, err) + + require.Equal(t, http.StatusOK, res.StatusCode(), "received the following body: %s", res.Body) + require.NotNil(t, res.JSON200) + require.NotNil(t, res.JSON200.HasAccess) + assert.True(t, *res.JSON200.HasAccess) + }) } diff --git a/openmeter/customer/entity/customer.go b/openmeter/customer/entity/customer.go index 790e6b6a3..996cb3135 100644 --- a/openmeter/customer/entity/customer.go +++ b/openmeter/customer/entity/customer.go @@ -167,3 +167,24 @@ type GetCustomerInput CustomerID func (i GetCustomerInput) Validate() error { return CustomerID(i).Validate() } + +type GetEntitlementValueInput struct { + ID models.NamespacedID + FeatureKey string +} + +func (i GetEntitlementValueInput) Validate() error { + if err := i.ID.Validate(); err != nil { + return ValidationError{ + Err: err, + } + } + + if i.FeatureKey == "" { + return ValidationError{ + Err: errors.New("feature key is required"), + } + } + + return nil +} diff --git a/openmeter/customer/httpdriver/customer.go b/openmeter/customer/httpdriver/customer.go index c7d92cd88..f95973546 100644 --- a/openmeter/customer/httpdriver/customer.go +++ b/openmeter/customer/httpdriver/customer.go @@ -10,9 +10,11 @@ import ( "github.com/openmeterio/openmeter/api" "github.com/openmeterio/openmeter/openmeter/customer" customerentity "github.com/openmeterio/openmeter/openmeter/customer/entity" + entitlementdriver "github.com/openmeterio/openmeter/openmeter/entitlement/driver" "github.com/openmeterio/openmeter/pkg/defaultx" "github.com/openmeterio/openmeter/pkg/framework/commonhttp" "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" + "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/pkg/pagination" "github.com/openmeterio/openmeter/pkg/sortx" ) @@ -283,3 +285,47 @@ func (h *handler) GetCustomer() GetCustomerHandler { )..., ) } + +type ( + GetCustomerEntitlementValueRequest = customerentity.GetEntitlementValueInput + GetCustomerEntitlementValueResponse = api.EntitlementValue + GetCustomerEntitlementValueParams = struct { + CustomerID string + FeatureKey string + } + GetCustomerEntitlementValueHandler httptransport.HandlerWithArgs[GetCustomerEntitlementValueRequest, GetCustomerEntitlementValueResponse, GetCustomerEntitlementValueParams] +) + +// GetCustomerEntitlementValue returns a handler for getting a customer. +func (h *handler) GetCustomerEntitlementValue() GetCustomerEntitlementValueHandler { + return httptransport.NewHandlerWithArgs( + func(ctx context.Context, r *http.Request, params GetCustomerEntitlementValueParams) (GetCustomerEntitlementValueRequest, error) { + ns, err := h.resolveNamespace(ctx) + if err != nil { + return GetCustomerEntitlementValueRequest{}, err + } + + return GetCustomerEntitlementValueRequest{ + FeatureKey: params.FeatureKey, + ID: models.NamespacedID{ + ID: params.CustomerID, + Namespace: ns, + }, + }, nil + }, + func(ctx context.Context, request GetCustomerEntitlementValueRequest) (GetCustomerEntitlementValueResponse, error) { + val, err := h.service.GetEntitlementValue(ctx, request) + if err != nil { + return GetCustomerEntitlementValueResponse{}, err + } + + return entitlementdriver.MapEntitlementValueToAPI(val) + }, + commonhttp.JSONResponseEncoderWithStatus[GetCustomerEntitlementValueResponse](http.StatusOK), + httptransport.AppendOptions( + h.options, + httptransport.WithOperationName("getCustomer"), + httptransport.WithErrorEncoder(errorEncoder()), + )..., + ) +} diff --git a/openmeter/customer/httpdriver/errors.go b/openmeter/customer/httpdriver/errors.go index f6a165089..fc8d1e88c 100644 --- a/openmeter/customer/httpdriver/errors.go +++ b/openmeter/customer/httpdriver/errors.go @@ -19,7 +19,7 @@ func errorEncoder() httptransport.ErrorEncoder { commonhttp.HandleErrorIfTypeMatches[customerentity.SubjectKeyConflictError](ctx, http.StatusConflict, err, w) || commonhttp.HandleErrorIfTypeMatches[customerentity.ForbiddenError](ctx, http.StatusBadRequest, err, w) || commonhttp.HandleErrorIfTypeMatches[*models.GenericUserError](ctx, http.StatusBadRequest, err, w) || - + commonhttp.HandleErrorIfTypeMatches[*models.GenericConflictError](ctx, http.StatusConflict, err, w) || // TODO: we have to add app errors as it can happen when cutomer app data is created or updated commonhttp.HandleErrorIfTypeMatches[app.AppCustomerPreConditionError](ctx, http.StatusConflict, err, w) || commonhttp.HandleErrorIfTypeMatches[app.AppNotFoundError](ctx, http.StatusNotFound, err, w) diff --git a/openmeter/customer/httpdriver/handler.go b/openmeter/customer/httpdriver/handler.go index a32187a3e..1bf125528 100644 --- a/openmeter/customer/httpdriver/handler.go +++ b/openmeter/customer/httpdriver/handler.go @@ -21,6 +21,7 @@ type CustomerHandler interface { DeleteCustomer() DeleteCustomerHandler GetCustomer() GetCustomerHandler UpdateCustomer() UpdateCustomerHandler + GetCustomerEntitlementValue() GetCustomerEntitlementValueHandler } var _ Handler = (*handler)(nil) diff --git a/openmeter/customer/service.go b/openmeter/customer/service.go index b8ee521f7..88566d21c 100644 --- a/openmeter/customer/service.go +++ b/openmeter/customer/service.go @@ -4,6 +4,7 @@ import ( "context" customerentity "github.com/openmeterio/openmeter/openmeter/customer/entity" + "github.com/openmeterio/openmeter/openmeter/entitlement" "github.com/openmeterio/openmeter/pkg/pagination" ) @@ -17,4 +18,5 @@ type CustomerService interface { DeleteCustomer(ctx context.Context, customer customerentity.DeleteCustomerInput) error GetCustomer(ctx context.Context, customer customerentity.GetCustomerInput) (*customerentity.Customer, error) UpdateCustomer(ctx context.Context, params customerentity.UpdateCustomerInput) (*customerentity.Customer, error) + GetEntitlementValue(ctx context.Context, input customerentity.GetEntitlementValueInput) (entitlement.EntitlementValue, error) } diff --git a/openmeter/customer/service/customer.go b/openmeter/customer/service/customer.go index 0d2dcece7..82ab311f4 100644 --- a/openmeter/customer/service/customer.go +++ b/openmeter/customer/service/customer.go @@ -2,9 +2,13 @@ package customerservice import ( "context" + "fmt" "github.com/openmeterio/openmeter/openmeter/customer" customerentity "github.com/openmeterio/openmeter/openmeter/customer/entity" + "github.com/openmeterio/openmeter/openmeter/entitlement" + "github.com/openmeterio/openmeter/pkg/clock" + "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/pkg/pagination" ) @@ -29,3 +33,23 @@ func (s *Service) GetCustomer(ctx context.Context, input customerentity.GetCusto func (s *Service) UpdateCustomer(ctx context.Context, input customerentity.UpdateCustomerInput) (*customerentity.Customer, error) { return s.adapter.UpdateCustomer(ctx, input) } + +func (s *Service) GetEntitlementValue(ctx context.Context, input customerentity.GetEntitlementValueInput) (entitlement.EntitlementValue, error) { + cust, err := s.GetCustomer(ctx, customerentity.GetCustomerInput{ + Namespace: input.ID.Namespace, + ID: input.ID.ID, + }) + if err != nil { + return nil, err + } + + if len(cust.UsageAttribution.SubjectKeys) != 1 { + return nil, &models.GenericConflictError{ + Inner: fmt.Errorf("customer %s has multiple subject keys", input.ID.ID), + } + } + + subjectKey := cust.UsageAttribution.SubjectKeys[0] + + return s.entitlementConnector.GetEntitlementValue(ctx, input.ID.Namespace, subjectKey, input.FeatureKey, clock.Now()) +} diff --git a/openmeter/customer/service/service.go b/openmeter/customer/service/service.go index 2581d8c9f..a04ae51c5 100644 --- a/openmeter/customer/service/service.go +++ b/openmeter/customer/service/service.go @@ -4,16 +4,19 @@ import ( "errors" "github.com/openmeterio/openmeter/openmeter/customer" + "github.com/openmeterio/openmeter/openmeter/entitlement" ) var _ customer.Service = (*Service)(nil) type Service struct { - adapter customer.Adapter + adapter customer.Adapter + entitlementConnector entitlement.Connector } type Config struct { - Adapter customer.Adapter + Adapter customer.Adapter + EntitlementConnector entitlement.Connector } func (c Config) Validate() error { @@ -30,6 +33,7 @@ func New(config Config) (*Service, error) { } return &Service{ - adapter: config.Adapter, + adapter: config.Adapter, + entitlementConnector: config.EntitlementConnector, }, nil } diff --git a/openmeter/server/router/customer.go b/openmeter/server/router/customer.go index 6675ec12d..689705381 100644 --- a/openmeter/server/router/customer.go +++ b/openmeter/server/router/customer.go @@ -5,6 +5,7 @@ import ( "github.com/openmeterio/openmeter/api" "github.com/openmeterio/openmeter/openmeter/app/httpdriver" + chttpdriver "github.com/openmeterio/openmeter/openmeter/customer/httpdriver" ) // List customers @@ -62,3 +63,12 @@ func (a *Router) DeleteCustomerAppData(w http.ResponseWriter, r *http.Request, c AppId: appID, }).ServeHTTP(w, r) } + +// Get entitlement value +// (GET /api/v1/customers/{customerId}/entitlements/{featureKey}/value) +func (a *Router) GetCustomerEntitlementValue(w http.ResponseWriter, r *http.Request, customerId string, featureKey string, params api.GetCustomerEntitlementValueParams) { + a.customerHandler.GetCustomerEntitlementValue().With(chttpdriver.GetCustomerEntitlementValueParams{ + CustomerID: customerId, + FeatureKey: featureKey, + }).ServeHTTP(w, r) +} diff --git a/openmeter/server/server_test.go b/openmeter/server/server_test.go index 5cdfd1010..992106225 100644 --- a/openmeter/server/server_test.go +++ b/openmeter/server/server_test.go @@ -836,3 +836,7 @@ func (n NoopCustomerService) GetCustomer(ctx context.Context, customer customere func (n NoopCustomerService) UpdateCustomer(ctx context.Context, params customerentity.UpdateCustomerInput) (*customerentity.Customer, error) { return &customerentity.Customer{}, nil } + +func (n NoopCustomerService) GetEntitlementValue(ctx context.Context, input customerentity.GetEntitlementValueInput) (entitlement.EntitlementValue, error) { + return nil, nil +} diff --git a/openmeter/subscription/testutils/customer.go b/openmeter/subscription/testutils/customer.go index 050fe1699..10e60e7f9 100644 --- a/openmeter/subscription/testutils/customer.go +++ b/openmeter/subscription/testutils/customer.go @@ -10,7 +10,11 @@ import ( customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" customerentity "github.com/openmeterio/openmeter/openmeter/customer/entity" customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" + "github.com/openmeterio/openmeter/openmeter/meter" + registrybuilder "github.com/openmeterio/openmeter/openmeter/registry/builder" + streamingtestutils "github.com/openmeterio/openmeter/openmeter/streaming/testutils" "github.com/openmeterio/openmeter/openmeter/testutils" + "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" ) @@ -36,10 +40,26 @@ func NewCustomerAdapter(t *testing.T, dbDeps *DBDeps) *testCustomerRepo { func NewCustomerService(t *testing.T, dbDeps *DBDeps) customer.Service { t.Helper() + meterRepo := meter.NewInMemoryRepository([]models.Meter{{ + Slug: ExampleFeatureMeterSlug, + Namespace: ExampleNamespace, + Aggregation: models.MeterAggregationSum, + WindowSize: models.WindowSizeMinute, + }}) + + entitlementRegistry := registrybuilder.GetEntitlementRegistry(registrybuilder.EntitlementOptions{ + DatabaseClient: dbDeps.DBClient, + StreamingConnector: streamingtestutils.NewMockStreamingConnector(t), + Logger: testutils.NewLogger(t), + MeterRepository: meterRepo, + Publisher: eventbus.NewMock(t), + }) + customerAdapter := NewCustomerAdapter(t, dbDeps) customerService, err := customerservice.New(customerservice.Config{ - Adapter: customerAdapter, + Adapter: customerAdapter, + EntitlementConnector: entitlementRegistry.Entitlement, }) if err != nil { t.Fatalf("failed to create customer service: %v", err) diff --git a/test/app/stripe/testenv.go b/test/app/stripe/testenv.go index bdb61f4db..87fffc025 100644 --- a/test/app/stripe/testenv.go +++ b/test/app/stripe/testenv.go @@ -17,7 +17,12 @@ import ( "github.com/openmeterio/openmeter/openmeter/customer" customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" + "github.com/openmeterio/openmeter/openmeter/meter" + registrybuilder "github.com/openmeterio/openmeter/openmeter/registry/builder" + streamingtestutils "github.com/openmeterio/openmeter/openmeter/streaming/testutils" "github.com/openmeterio/openmeter/openmeter/testutils" + "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" + "github.com/openmeterio/openmeter/pkg/models" ) const ( @@ -105,8 +110,19 @@ func NewTestEnv(t *testing.T, ctx context.Context) (TestEnv, error) { return nil, fmt.Errorf("failed to create customer repo: %w", err) } + meterRepo := meter.NewInMemoryRepository([]models.Meter{}) + + entitlementRegistry := registrybuilder.GetEntitlementRegistry(registrybuilder.EntitlementOptions{ + DatabaseClient: entClient, + StreamingConnector: streamingtestutils.NewMockStreamingConnector(t), + Logger: logger, + MeterRepository: meterRepo, + Publisher: eventbus.NewMock(t), + }) + customerService, err := customerservice.New(customerservice.Config{ - Adapter: customerAdapter, + Adapter: customerAdapter, + EntitlementConnector: entitlementRegistry.Entitlement, }) if err != nil { return nil, fmt.Errorf("failed to create customer service: %w", err) diff --git a/test/app/testenv.go b/test/app/testenv.go index f41a7e5a5..dbce1dd22 100644 --- a/test/app/testenv.go +++ b/test/app/testenv.go @@ -14,9 +14,14 @@ import ( appstripeservice "github.com/openmeterio/openmeter/openmeter/app/stripe/service" customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" + "github.com/openmeterio/openmeter/openmeter/meter" + registrybuilder "github.com/openmeterio/openmeter/openmeter/registry/builder" secretadapter "github.com/openmeterio/openmeter/openmeter/secret/adapter" secretservice "github.com/openmeterio/openmeter/openmeter/secret/service" + streamingtestutils "github.com/openmeterio/openmeter/openmeter/streaming/testutils" "github.com/openmeterio/openmeter/openmeter/testutils" + "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" + "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/tools/migrate" ) @@ -76,8 +81,19 @@ func NewTestEnv(t *testing.T, ctx context.Context) (TestEnv, error) { return nil, fmt.Errorf("failed to create customer repo: %w", err) } + meterRepo := meter.NewInMemoryRepository([]models.Meter{}) + + entitlementRegistry := registrybuilder.GetEntitlementRegistry(registrybuilder.EntitlementOptions{ + DatabaseClient: entClient, + StreamingConnector: streamingtestutils.NewMockStreamingConnector(t), + Logger: logger, + MeterRepository: meterRepo, + Publisher: eventbus.NewMock(t), + }) + customerService, err := customerservice.New(customerservice.Config{ - Adapter: customerAdapter, + Adapter: customerAdapter, + EntitlementConnector: entitlementRegistry.Entitlement, }) if err != nil { return nil, fmt.Errorf("failed to create customer service: %w", err) diff --git a/test/billing/suite.go b/test/billing/suite.go index a0334e425..95d53a12b 100644 --- a/test/billing/suite.go +++ b/test/billing/suite.go @@ -32,8 +32,8 @@ import ( customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" "github.com/openmeterio/openmeter/openmeter/ent/db" "github.com/openmeterio/openmeter/openmeter/meter" - featureadapter "github.com/openmeterio/openmeter/openmeter/productcatalog/adapter" "github.com/openmeterio/openmeter/openmeter/productcatalog/feature" + registrybuilder "github.com/openmeterio/openmeter/openmeter/registry/builder" streamingtestutils "github.com/openmeterio/openmeter/openmeter/streaming/testutils" "github.com/openmeterio/openmeter/openmeter/testutils" "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" @@ -93,9 +93,18 @@ func (s *BaseSuite) SetupSuite() { s.MeterRepo = meter.NewInMemoryRepository(nil) s.MockStreamingConnector = streamingtestutils.NewMockStreamingConnector(t) + // Entitlement + entitlementRegistry := registrybuilder.GetEntitlementRegistry(registrybuilder.EntitlementOptions{ + DatabaseClient: dbClient, + StreamingConnector: streamingtestutils.NewMockStreamingConnector(t), + Logger: slog.Default(), + MeterRepository: s.MeterRepo, + Publisher: eventbus.NewMock(t), + }) + // Feature - s.FeatureRepo = featureadapter.NewPostgresFeatureRepo(dbClient, slog.Default()) - s.FeatureService = feature.NewFeatureConnector(s.FeatureRepo, s.MeterRepo) + s.FeatureRepo = entitlementRegistry.FeatureRepo + s.FeatureService = entitlementRegistry.Feature // Customer @@ -104,10 +113,10 @@ func (s *BaseSuite) SetupSuite() { Logger: slog.Default(), }) require.NoError(t, err) - s.CustomerService = customer.Service(customerAdapter) customerService, err := customerservice.New(customerservice.Config{ - Adapter: customerAdapter, + Adapter: customerAdapter, + EntitlementConnector: entitlementRegistry.Entitlement, }) require.NoError(t, err) s.CustomerService = customerService diff --git a/test/customer/testenv.go b/test/customer/testenv.go index bff91cdda..1341be353 100644 --- a/test/customer/testenv.go +++ b/test/customer/testenv.go @@ -9,8 +9,13 @@ import ( "github.com/openmeterio/openmeter/openmeter/customer" customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" + "github.com/openmeterio/openmeter/openmeter/meter" + registrybuilder "github.com/openmeterio/openmeter/openmeter/registry/builder" + streamingtestutils "github.com/openmeterio/openmeter/openmeter/streaming/testutils" "github.com/openmeterio/openmeter/openmeter/subscription" subscriptiontestutils "github.com/openmeterio/openmeter/openmeter/subscription/testutils" + "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" + "github.com/openmeterio/openmeter/pkg/models" ) const ( @@ -64,8 +69,19 @@ func NewTestEnv(t *testing.T, ctx context.Context) (TestEnv, error) { return nil, fmt.Errorf("failed to create customer adapter: %w", err) } + meterRepo := meter.NewInMemoryRepository([]models.Meter{}) + + entitlementRegistry := registrybuilder.GetEntitlementRegistry(registrybuilder.EntitlementOptions{ + DatabaseClient: dbDeps.DBClient, + StreamingConnector: streamingtestutils.NewMockStreamingConnector(t), + Logger: logger, + MeterRepository: meterRepo, + Publisher: eventbus.NewMock(t), + }) + customerService, err := customerservice.New(customerservice.Config{ - Adapter: customerAdapter, + Adapter: customerAdapter, + EntitlementConnector: entitlementRegistry.Entitlement, }) if err != nil { return nil, err