viagogo · API Governance Rules

viagogo API Rules

Spectral linting rules defining API design standards and conventions for viagogo.

54 Rules error 40 warn 12 info 2
Generated by API Evangelist Written by API Evangelist tooling for viagogo's APIs. It is a starting point, not a ruleset viagogo publishes or enforces.
View Rules File View on GitHub

Rule Categories

info mediatype oauthflow operation parameter path requestbody response root schema securityscheme server servers tag

Rules

error
operation-has-operationid
Every operation declares an operationId (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete]
error
operation-has-summary
Every operation has a summary (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete]
error
operation-has-tags
Every operation is tagged (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete]
error
operation-has-success-response
Every operation declares a 2xx response (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete].responses
error
operation-declares-4xx
Every operation declares at least one 4xx response (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete].responses
error
operation-declares-401-or-403
Every operation declares 401 or 403 (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete].responses
warn
operation-secured
Every operation declares its own security requirement (measured: 98% of this contract)
$.paths[*][get,post,put,patch,delete]
warn
root-security-declared
The contract declares security at the root (measured: 90% of this contract)
$
error
path-segment-casing-snake
Path segments are snake case (measured: 100% of this contract)
$.paths[*]~
error
path-no-trailing-slash
Paths carry no trailing slash (measured: 100% of this contract)
$.paths[*]~
error
path-params-in-braces
Path parameters use {braces}, not :colon (measured: 100% of this contract)
$.paths[*]~
error
servers-https
Servers are https (measured: 100% of this contract)
$.servers[*].url
info
response-media-type
Responses are served as application/hal+json (measured: 80% of this contract)
$.paths[*][get,post,put,patch,delete].responses[*].content
error
info-title-present
Info declares title (measured: 100% of this contract)
$.info
warn
info-title-min-length
Info.title runs at least 18 characters (measured: 95% of this contract)
$.info.title
error
info-description-min-length
Info.description runs at least 35 characters (measured: 100% of this contract)
$.info.description
error
info-version-present
Info declares version (measured: 100% of this contract)
$.info
error
info-version-semver
info.version is numeric (measured: 100% of this contract)
$.info.version
error
server-url-present
Server declares url (measured: 100% of this contract)
$.servers[*]
error
server-url-https
Server.url is https (measured: 100% of this contract)
$.servers[*].url
error
server-description-present
Server declares description (measured: 100% of this contract)
$.servers[*]
error
server-description-min-length
Server.description runs at least 7 characters (measured: 100% of this contract)
$.servers[*].description
error
tag-name-present
Tag declares name (measured: 100% of this contract)
$.tags[*]
error
tag-description-min-length
Tag.description runs at least 35 characters (measured: 100% of this contract)
$.tags[*].description
error
operation-tags-present
Operation declares tags (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
error
operation-summary-present
Operation declares summary (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
warn
operation-summary-min-length
Operation.summary runs at least 11 characters (measured: 97% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].summary
warn
operation-description-min-length
Operation.description runs at least 38 characters (measured: 97% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].description
error
operation-operationid-present
Operation declares operationId (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
info
operation-parameters-present
Operation declares parameters (measured: 86% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
error
operation-responses-present
Operation declares responses (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
warn
operation-security-present
Operation declares security (measured: 98% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
error
parameter-name-present
Parameter declares name (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
parameter-in-present
Parameter declares in (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
parameter-in-values
Parameter.in is one of path, query (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].in
warn
parameter-description-min-length
Parameter.description runs at least 34 characters (measured: 97% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].description
error
parameter-schema-present
Parameter declares schema (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
requestbody-content-present
RequestBody declares content (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].requestBody
error
mediatype-schema-present
MediaType declares schema (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].responses[*].content[*]
warn
response-description-present
Response declares description (measured: 90% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].responses[*]
warn
response-content-present
Response declares content (measured: 90% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].responses[*]
error
schema-type-present
Schema declares type (measured: 100% of this contract)
$.components.schemas[*]
warn
schema-type-values
Schema.type is one of object (measured: 99% of this contract)
$.components.schemas[*].type
warn
schema-description-min-length
Schema.description runs at least 18 characters (measured: 95% of this contract)
$.components.schemas[*].description
warn
schema-properties-present
Schema declares properties (measured: 99% of this contract)
$.components.schemas[*]
error
securityscheme-type-present
SecurityScheme declares type (measured: 100% of this contract)
$.components.securitySchemes[*]
error
securityscheme-type-values
SecurityScheme.type is one of oauth2 (measured: 100% of this contract)
$.components.securitySchemes[*].type
error
securityscheme-bearerformat-present
SecurityScheme declares bearerFormat (measured: 100% of this contract)
$.components.securitySchemes[*]
error
securityscheme-bearerformat-values
SecurityScheme.bearerFormat is one of JWT (measured: 100% of this contract)
$.components.securitySchemes[*].bearerFormat
error
securityscheme-flows-present
SecurityScheme declares flows (measured: 100% of this contract)
$.components.securitySchemes[*]
error
oauthflow-authorizationurl-https
OAuthFlow.authorizationUrl is https (measured: 100% of this contract)
$.components.securitySchemes[*].flows[*].authorizationUrl
error
oauthflow-tokenurl-present
OAuthFlow declares tokenUrl (measured: 100% of this contract)
$.components.securitySchemes[*].flows[*]
error
oauthflow-tokenurl-https
OAuthFlow.tokenUrl is https (measured: 100% of this contract)
$.components.securitySchemes[*].flows[*].tokenUrl
error
oauthflow-refreshurl-https
OAuthFlow.refreshUrl is https (measured: 100% of this contract)
$.components.securitySchemes[*].flows[*].refreshUrl

Spectral Ruleset

Raw ↑
# authorship: generated by API Evangelist tooling (derive-rules.py, 2026-11-01). x-method: generated
# Every rule below was MEASURED against viagogo's own contract before it was written; a rule is present only
# when the contract satisfies it at 80% or more. Severity: 100% -> error, >= 90% -> warn, else info.
# Provenance:
#   - operation-has-operationid: 100%
#   - operation-has-summary: 100%
#   - operation-has-tags: 100%
#   - operation-has-success-response: 100%
#   - operation-declares-4xx: 100%
#   - operation-declares-401-or-403: 100%
#   - operation-secured: 99%
#   - root-security-declared: 90%
#   - path-segment-casing-snake: 100%
#   - path-no-trailing-slash: 100%
#   - path-params-in-braces: 100%
#   - servers-https: 100%
#   - response-media-type: 80%
#   - info-title-present: 100%
#   - info-title-min-length: 95%
#   - info-description-min-length: 100%
#   - info-version-present: 100%
#   - info-version-semver: 100%
#   - server-url-present: 100%
#   - server-url-https: 100%
#   - server-description-present: 100%
#   - server-description-min-length: 100%
#   - tag-name-present: 100%
#   - tag-description-min-length: 100%
#   - operation-tags-present: 100%
#   - operation-summary-present: 100%
#   - operation-summary-min-length: 98%
#   - operation-description-min-length: 97%
#   - operation-operationid-present: 100%
#   - operation-parameters-present: 87%
#   - operation-responses-present: 100%
#   - operation-security-present: 99%
#   - parameter-name-present: 100%
#   - parameter-in-present: 100%
#   - parameter-in-values: 100%
#   - parameter-description-min-length: 98%
#   - parameter-schema-present: 100%
#   - requestbody-content-present: 100%
#   - mediatype-schema-present: 100%
#   - response-description-present: 90%
#   - response-content-present: 90%
#   - schema-type-present: 100%
#   - schema-type-values: 99%
#   - schema-description-min-length: 96%
#   - schema-properties-present: 99%
#   - securityscheme-type-present: 100%
#   - securityscheme-type-values: 100%
#   - securityscheme-bearerformat-present: 100%
#   - securityscheme-bearerformat-values: 100%
#   - securityscheme-flows-present: 100%
#   - oauthflow-authorizationurl-https: 100%
#   - oauthflow-tokenurl-present: 100%
#   - oauthflow-tokenurl-https: 100%
#   - oauthflow-refreshurl-https: 100%
x-method: generated
x-generator: derive-rules.py
x-generated: '2026-11-01'
x-source:
- openapi/viagogo-addresses-api-openapi.yml
- openapi/viagogo-categories-api-openapi.yml
- openapi/viagogo-e-tickets-api-openapi.yml
- openapi/viagogo-events-api-openapi.yml
- openapi/viagogo-listing-offers-api-openapi.yml
x-self-check:
  status: checked
  rules: 54
  dropped: {}
extends:
- - spectral:oas
  - recommended
formats:
- oas3
rules:
  operation-has-operationid:
    description: 'Every operation declares an operationId (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete]
    then:
      field: operationId
      function: truthy
    x-pattern-key: Operation.operationId|present
  operation-has-summary:
    description: 'Every operation has a summary (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete]
    then:
      field: summary
      function: truthy
    x-pattern-key: Operation.summary|present
  operation-has-tags:
    description: 'Every operation is tagged (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete]
    then:
      field: tags
      function: truthy
    x-pattern-key: Operation.tags|present
  operation-has-success-response:
    description: 'Every operation declares a 2xx response (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete].responses
    then:
      function: schema
      functionOptions:
        schema:
          type: object
          patternProperties:
            ^2\d\d$: {}
          minProperties: 1
    x-pattern-key: Operation.responses|schema:07e20b47
  operation-declares-4xx:
    description: 'Every operation declares at least one 4xx response (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete].responses
    then:
      function: schema
      functionOptions:
        schema:
          type: object
          patternProperties:
            ^4\d\d$: {}
          minProperties: 1
    x-pattern-key: Operation.responses|schema:4aea4da4
  operation-declares-401-or-403:
    description: 'Every operation declares 401 or 403 (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete].responses
    then:
      function: schema
      functionOptions:
        schema:
          type: object
          anyOf:
          - required:
            - '401'
          - required:
            - '403'
    x-pattern-key: Operation.responses|schema:f26ae517
  operation-secured:
    description: 'Every operation declares its own security requirement (measured: 98% of this contract)'
    severity: warn
    given: $.paths[*][get,post,put,patch,delete]
    then:
      field: security
      function: truthy
    x-pattern-key: Operation.security|present
  root-security-declared:
    description: 'The contract declares security at the root (measured: 90% of this contract)'
    severity: warn
    given: $
    then:
      field: security
      function: truthy
    x-pattern-key: OpenAPI.security|present
  path-segment-casing-snake:
    description: 'Path segments are snake case (measured: 100% of this contract)'
    severity: error
    given: $.paths[*]~
    then:
      function: pattern
      functionOptions:
        match: ^(/[a-z0-9]+(_[a-z0-9]+)*|/\{[^}]+\})+/?$
    x-pattern-key: Paths.{key}|pattern:^(/[a-z0-9]+(_[a-z0-9]+)*|/\{[^}]+\})+/?$
  path-no-trailing-slash:
    description: 'Paths carry no trailing slash (measured: 100% of this contract)'
    severity: error
    given: $.paths[*]~
    then:
      function: pattern
      functionOptions:
        notMatch: ./$
    x-pattern-key: Paths.{key}|pattern:!./$
  path-params-in-braces:
    description: 'Path parameters use {braces}, not :colon (measured: 100% of this contract)'
    severity: error
    given: $.paths[*]~
    then:
      function: pattern
      functionOptions:
        notMatch: ':'
    x-pattern-key: 'Paths.{key}|pattern:!:'
  servers-https:
    description: 'Servers are https (measured: 100% of this contract)'
    severity: error
    given: $.servers[*].url
    then:
      function: pattern
      functionOptions:
        match: ^(https://|\{)
    x-pattern-key: Server.url|pattern:^(https://|\{)
  response-media-type:
    description: 'Responses are served as application/hal+json (measured: 80% of this contract)'
    severity: info
    given: $.paths[*][get,post,put,patch,delete].responses[*].content
    then:
      function: schema
      functionOptions:
        schema:
          type: object
          required:
          - application/hal+json
    x-pattern-key: Response.content|schema:de737387
  info-title-present:
    description: 'Info declares title (measured: 100% of this contract)'
    severity: error
    given: $.info
    then:
      field: title
      function: defined
    x-pattern-key: Info.title|present
  info-title-min-length:
    description: 'Info.title runs at least 18 characters (measured: 95% of this contract)'
    severity: warn
    given: $.info.title
    then:
      function: length
      functionOptions:
        min: 18
    x-pattern-key: Info.title|length
  info-description-min-length:
    description: 'Info.description runs at least 35 characters (measured: 100% of this contract)'
    severity: error
    given: $.info.description
    then:
      function: length
      functionOptions:
        min: 35
    x-pattern-key: Info.description|length
  info-version-present:
    description: 'Info declares version (measured: 100% of this contract)'
    severity: error
    given: $.info
    then:
      field: version
      function: defined
    x-pattern-key: Info.version|present
  info-version-semver:
    description: 'info.version is numeric (measured: 100% of this contract)'
    severity: error
    given: $.info.version
    then:
      function: pattern
      functionOptions:
        match: ^v?\d+(\.\d+)*
    x-pattern-key: Info.version|pattern:^v?\d+(\.\d+)*
  server-url-present:
    description: 'Server declares url (measured: 100% of this contract)'
    severity: error
    given: $.servers[*]
    then:
      field: url
      function: defined
    x-pattern-key: Server.url|present
  server-url-https:
    description: 'Server.url is https (measured: 100% of this contract)'
    severity: error
    given: $.servers[*].url
    then:
      function: pattern
      functionOptions:
        match: ^https://
    x-pattern-key: Server.url|pattern:^https://
  server-description-present:
    description: 'Server declares description (measured: 100% of this contract)'
    severity: error
    given: $.servers[*]
    then:
      field: description
      function: defined
    x-pattern-key: Server.description|present
  server-description-min-length:
    description: 'Server.description runs at least 7 characters (measured: 100% of this contract)'
    severity: error
    given: $.servers[*].description
    then:
      function: length
      functionOptions:
        min: 7
    x-pattern-key: Server.description|length
  tag-name-present:
    description: 'Tag declares name (measured: 100% of this contract)'
    severity: error
    given: $.tags[*]
    then:
      field: name
      function: defined
    x-pattern-key: Tag.name|present
  tag-description-min-length:
    description: 'Tag.description runs at least 35 characters (measured: 100% of this contract)'
    severity: error
    given: $.tags[*].description
    then:
      function: length
      functionOptions:
        min: 35
    x-pattern-key: Tag.description|length
  operation-tags-present:
    description: 'Operation declares tags (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: tags
      function: defined
    x-pattern-key: Operation.tags|present
  operation-summary-present:
    description: 'Operation declares summary (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: summary
      function: defined
    x-pattern-key: Operation.summary|present
  operation-summary-min-length:
    description: 'Operation.summary runs at least 11 characters (measured: 97% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].summary
    then:
      function: length
      functionOptions:
        min: 11
    x-pattern-key: Operation.summary|length
  operation-description-min-length:
    description: 'Operation.description runs at least 38 characters (measured: 97% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].description
    then:
      function: length
      functionOptions:
        min: 38
    x-pattern-key: Operation.description|length
  operation-operationid-present:
    description: 'Operation declares operationId (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: operationId
      function: defined
    x-pattern-key: Operation.operationId|present
  operation-parameters-present:
    description: 'Operation declares parameters (measured: 86% of this contract)'
    severity: info
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: parameters
      function: defined
    x-pattern-key: Operation.parameters|present
  operation-responses-present:
    description: 'Operation declares responses (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: responses
      function: defined
    x-pattern-key: Operation.responses|present
  operation-security-present:
    description: 'Operation declares security (measured: 98% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: security
      function: defined
    x-pattern-key: Operation.security|present
  parameter-name-present:
    description: 'Parameter declares name (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
    then:
      field: name
      function: defined
    x-pattern-key: Parameter.name|present
  parameter-in-present:
    description: 'Parameter declares in (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
    then:
      field: in
      function: defined
    x-pattern-key: Parameter.in|present
  parameter-in-values:
    description: 'Parameter.in is one of path, query (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].in
    then:
      function: enumeration
      functionOptions:
        values:
        - path
        - query
    x-pattern-key: Parameter.in|enum:path,query
  parameter-description-min-length:
    description: 'Parameter.description runs at least 34 characters (measured: 97% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].description
    then:
      function: length
      functionOptions:
        min: 34
    x-pattern-key: Parameter.description|length
  parameter-schema-present:
    description: 'Parameter declares schema (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
    then:
      field: schema
      function: defined
    x-pattern-key: Parameter.schema|present
  requestbody-content-present:
    description: 'RequestBody declares content (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].requestBody
    then:
      field: content
      function: defined
    x-pattern-key: RequestBody.content|present
  mediatype-schema-present:
    description: 'MediaType declares schema (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].responses[*].content[*]
    then:
      field: schema
      function: defined
    x-pattern-key: MediaType.schema|present
  response-description-present:
    description: 'Response declares description (measured: 90% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].responses[*]
    then:
      field: description
      function: defined
    x-pattern-key: Response.description|present
  response-content-present:
    description: 'Response declares content (measured: 90% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].responses[*]
    then:
      field: content
      function: defined
    x-pattern-key: Response.content|present
  schema-type-present:
    description: 'Schema declares type (measured: 100% of this contract)'
    severity: error
    given: $.components.schemas[*]
    then:
      field: type
      function: defined
    x-pattern-key: Schema.type|present
  schema-type-values:
    description: 'Schema.type is one of object (measured: 99% of this contract)'
    severity: warn
    given: $.components.schemas[*].type
    then:
      function: enumeration
      functionOptions:
        values:
        - object
    x-pattern-key: Schema.type|enum:object
  schema-description-min-length:
    description: 'Schema.description runs at least 18 characters (measured: 95% of this contract)'
    severity: warn
    given: $.components.schemas[*].description
    then:
      function: length
      functionOptions:
        min: 18
    x-pattern-key: Schema.description|length
  schema-properties-present:
    description: 'Schema declares properties (measured: 99% of this contract)'
    severity: warn
    given: $.components.schemas[*]
    then:
      field: properties
      function: defined
    x-pattern-key: Schema.properties|present
  securityscheme-type-present:
    description: 'SecurityScheme declares type (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*]
    then:
      field: type
      function: defined
    x-pattern-key: SecurityScheme.type|present
  securityscheme-type-values:
    description: 'SecurityScheme.type is one of oauth2 (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*].type
    then:
      function: enumeration
      functionOptions:
        values:
        - oauth2
    x-pattern-key: SecurityScheme.type|enum:oauth2
  securityscheme-bearerformat-present:
    description: 'SecurityScheme declares bearerFormat (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*]
    then:
      field: bearerFormat
      function: defined
    x-pattern-key: SecurityScheme.bearerFormat|present
  securityscheme-bearerformat-values:
    description: 'SecurityScheme.bearerFormat is one of JWT (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*].bearerFormat
    then:
      function: enumeration
      functionOptions:
        values:
        - JWT
    x-pattern-key: SecurityScheme.bearerFormat|enum:JWT
  securityscheme-flows-present:
    description: 'SecurityScheme declares flows (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*]
    then:
      field: flows
      function: defined
    x-pattern-key: SecurityScheme.flows|present
  oauthflow-authorizationurl-https:
    description: 'OAuthFlow.authorizationUrl is https (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*].flows[*].authorizationUrl
    then:
      function: pattern
      functionOptions:
        match: ^https://
    x-pattern-key: OAuthFlow.authorizationUrl|pattern:^https://
  oauthflow-tokenurl-present:
    description: 'OAuthFlow declares tokenUrl (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*].flows[*]
    then:
      field: tokenUrl
      function: defined
    x-pattern-key: OAuthFlow.tokenUrl|present
  oauthflow-tokenurl-https:
    description: 'OAuthFlow.tokenUrl is https (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*].flows[*].tokenUrl
    then:
      function: pattern
      functionOptions:
        match: ^https://
    x-pattern-key: OAuthFlow.tokenUrl|pattern:^https://
  oauthflow-refreshurl-https:
    description: 'OAuthFlow.refreshUrl is https (measured: 100% of this contract)'
    severity: error
    given: $.components.securitySchemes[*].flows[*].refreshUrl
    then:
      function: pattern
      functionOptions:
        match: ^https://
    x-pattern-key: OAuthFlow.refreshUrl|pattern:^https://

Work with this as data

Every ruleset here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for spectral rules

4 MCP tools reach this
  • find_rulesBrowse and filter every ruleset in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This ruleset
curl "https://apis.io/api/v1/rules/viagogo-rules"
All spectral rules
curl "https://apis.io/api/v1/rules?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.