BlockSigner · API Governance Rules

BlockSigner API Rules

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

44 Rules error 39 warn 4 info 1
Generated by API Evangelist Written by API Evangelist tooling for BlockSigner's APIs. It is a starting point, not a ruleset BlockSigner publishes or enforces.
View Rules File View on GitHub

Rule Categories

contact info mediatype operation parameter path property response schema server servers tag

Rules

error
operation-has-summary
Every operation has a summary (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete]
error
operation-has-description
Every operation has a description (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete]
warn
operation-has-tags
Every operation is tagged (measured: 94% 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
warn
operation-declares-4xx
Every operation declares at least one 4xx response (measured: 94% of this contract)
$.paths[*][get,post,put,patch,delete].responses
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
error
response-media-type
Responses are served as application/json (measured: 100% of this contract)
$.paths[*][get,post,put,patch,delete].responses[*].content
info
property-name-casing-snake
Schema property names are snake case (measured: 85% of this contract)
$.components.schemas[*].properties[*]~
error
info-has-description
The contract's info block carries a description (measured: 100% of this contract)
$.info
error
info-has-contact-or-terms
The contract's info block names a contact or terms of service (measured: 100% of this contract)
$.info
error
info-title-present
Info declares title (measured: 100% of this contract)
$.info
error
info-description-present
Info declares description (measured: 100% of this contract)
$.info
error
info-contact-present
Info declares contact (measured: 100% of this contract)
$.info
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
contact-url-present
Contact declares url (measured: 100% of this contract)
$.info.contact
error
contact-url-https
Contact.url is https (measured: 100% of this contract)
$.info.contact.url
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
tag-name-present
Tag declares name (measured: 100% of this contract)
$.tags[*]
error
tag-description-present
Tag declares description (measured: 100% of this contract)
$.tags[*]
warn
operation-tags-present
Operation declares tags (measured: 94% 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]
error
operation-summary-min-length
Operation.summary runs at least 15 characters (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].summary
error
operation-description-present
Operation declares description (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace]
error
operation-description-min-length
Operation.description runs at least 62 characters (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].description
error
operation-parameters-present
Operation declares parameters (measured: 100% 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]
error
parameter-name-present
Parameter declares name (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
parameter-name-casing-camel
Parameter.name is camel case (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].name
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 query (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].in
error
parameter-description-present
Parameter declares description (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
parameter-description-min-length
Parameter.description runs at least 27 characters (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].description
error
parameter-required-present
Parameter declares required (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
parameter-schema-present
Parameter declares schema (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
error
mediatype-schema-present
MediaType declares schema (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].responses[*].content[*]
error
response-description-present
Response declares description (measured: 100% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].responses[*]
warn
response-description-min-length
Response.description runs at least 58 characters (measured: 98% of this contract)
$.paths[*][get,put,post,delete,patch,options,head,trace].responses[*].description
error
schema-type-present
Schema declares type (measured: 100% of this contract)
$.components.schemas[*]
error
schema-type-values
Schema.type is one of object (measured: 100% of this contract)
$.components.schemas[*].type
error
schema-properties-present
Schema declares properties (measured: 100% of this contract)
$.components.schemas[*]

Spectral Ruleset

Raw ↑
# authorship: generated by API Evangelist tooling (derive-rules.py, 2026-11-02). x-method: generated
# Every rule below was MEASURED against BlockSigner'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-summary: 100%
#   - operation-has-description: 100%
#   - operation-has-tags: 94%
#   - operation-has-success-response: 100%
#   - operation-declares-4xx: 94%
#   - path-no-trailing-slash: 100%
#   - path-params-in-braces: 100%
#   - servers-https: 100%
#   - response-media-type: 100%
#   - property-name-casing-snake: 86%
#   - info-has-description: 100%
#   - info-has-contact-or-terms: 100%
#   - info-title-present: 100%
#   - info-description-present: 100%
#   - info-contact-present: 100%
#   - info-version-present: 100%
#   - info-version-semver: 100%
#   - contact-url-present: 100%
#   - contact-url-https: 100%
#   - server-url-present: 100%
#   - server-url-https: 100%
#   - tag-name-present: 100%
#   - tag-description-present: 100%
#   - operation-tags-present: 94%
#   - operation-summary-present: 100%
#   - operation-summary-min-length: 100%
#   - operation-description-present: 100%
#   - operation-description-min-length: 100%
#   - operation-parameters-present: 100%
#   - operation-responses-present: 100%
#   - parameter-name-present: 100%
#   - parameter-name-casing-camel: 100%
#   - parameter-in-present: 100%
#   - parameter-in-values: 100%
#   - parameter-description-present: 100%
#   - parameter-description-min-length: 100%
#   - parameter-required-present: 100%
#   - parameter-schema-present: 100%
#   - mediatype-schema-present: 100%
#   - response-description-present: 100%
#   - response-description-min-length: 99%
#   - schema-type-present: 100%
#   - schema-type-values: 100%
#   - schema-properties-present: 100%
x-method: generated
x-generator: derive-rules.py
x-generated: '2026-11-02'
x-source:
- openapi/blocksigner-org-openapi.json
x-self-check:
  status: skipped
  reason: gate not installed
extends:
- - spectral:oas
  - recommended
formats:
- oas3
rules:
  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-description:
    description: 'Every operation has a description (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete]
    then:
      field: description
      function: truthy
    x-pattern-key: Operation.description|present
  operation-has-tags:
    description: 'Every operation is tagged (measured: 94% of this contract)'
    severity: warn
    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: 94% of this contract)'
    severity: warn
    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
  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/json (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,post,put,patch,delete].responses[*].content
    then:
      function: schema
      functionOptions:
        schema:
          type: object
          required:
          - application/json
    x-pattern-key: Response.content|schema:2919cf38
  property-name-casing-snake:
    description: 'Schema property names are snake case (measured: 85% of this contract)'
    severity: info
    given: $.components.schemas[*].properties[*]~
    then:
      function: pattern
      functionOptions:
        match: ^[a-z0-9]+(_[a-z0-9]+)*$
    x-pattern-key: Schema.properties{key}|pattern:^[a-z0-9]+(_[a-z0-9]+)*$
  info-has-description:
    description: 'The contract''s info block carries a description (measured: 100% of this contract)'
    severity: error
    given: $.info
    then:
      field: description
      function: truthy
    x-pattern-key: Info.description|present
  info-has-contact-or-terms:
    description: 'The contract''s info block names a contact or terms of service (measured: 100% of this contract)'
    severity: error
    given: $.info
    then:
      function: schema
      functionOptions:
        schema:
          anyOf:
          - required:
            - contact
          - required:
            - termsOfService
    x-pattern-key: OpenAPI.info|schema:093268bf
  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-description-present:
    description: 'Info declares description (measured: 100% of this contract)'
    severity: error
    given: $.info
    then:
      field: description
      function: defined
    x-pattern-key: Info.description|present
  info-contact-present:
    description: 'Info declares contact (measured: 100% of this contract)'
    severity: error
    given: $.info
    then:
      field: contact
      function: defined
    x-pattern-key: Info.contact|present
  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+)*
  contact-url-present:
    description: 'Contact declares url (measured: 100% of this contract)'
    severity: error
    given: $.info.contact
    then:
      field: url
      function: defined
    x-pattern-key: Contact.url|present
  contact-url-https:
    description: 'Contact.url is https (measured: 100% of this contract)'
    severity: error
    given: $.info.contact.url
    then:
      function: pattern
      functionOptions:
        match: ^https://
    x-pattern-key: Contact.url|pattern:^https://
  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://
  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-present:
    description: 'Tag declares description (measured: 100% of this contract)'
    severity: error
    given: $.tags[*]
    then:
      field: description
      function: defined
    x-pattern-key: Tag.description|present
  operation-tags-present:
    description: 'Operation declares tags (measured: 94% of this contract)'
    severity: warn
    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 15 characters (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].summary
    then:
      function: length
      functionOptions:
        min: 15
    x-pattern-key: Operation.summary|length
  operation-description-present:
    description: 'Operation declares description (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace]
    then:
      field: description
      function: defined
    x-pattern-key: Operation.description|present
  operation-description-min-length:
    description: 'Operation.description runs at least 62 characters (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].description
    then:
      function: length
      functionOptions:
        min: 62
    x-pattern-key: Operation.description|length
  operation-parameters-present:
    description: 'Operation declares parameters (measured: 100% of this contract)'
    severity: error
    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
  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-name-casing-camel:
    description: 'Parameter.name is camel case (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].name
    then:
      function: pattern
      functionOptions:
        match: ^[a-z][a-zA-Z0-9]*$
    x-pattern-key: Parameter.name|pattern:^[a-z][a-zA-Z0-9]*$
  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 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:
        - query
    x-pattern-key: Parameter.in|enum:query
  parameter-description-present:
    description: 'Parameter declares description (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
    then:
      field: description
      function: defined
    x-pattern-key: Parameter.description|present
  parameter-description-min-length:
    description: 'Parameter.description runs at least 27 characters (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*].description
    then:
      function: length
      functionOptions:
        min: 27
    x-pattern-key: Parameter.description|length
  parameter-required-present:
    description: 'Parameter declares required (measured: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].parameters[*]
    then:
      field: required
      function: defined
    x-pattern-key: Parameter.required|present
  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
  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: 100% of this contract)'
    severity: error
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].responses[*]
    then:
      field: description
      function: defined
    x-pattern-key: Response.description|present
  response-description-min-length:
    description: 'Response.description runs at least 58 characters (measured: 98% of this contract)'
    severity: warn
    given: $.paths[*][get,put,post,delete,patch,options,head,trace].responses[*].description
    then:
      function: length
      functionOptions:
        min: 58
    x-pattern-key: Response.description|length
  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: 100% of this contract)'
    severity: error
    given: $.components.schemas[*].type
    then:
      function: enumeration
      functionOptions:
        values:
        - object
    x-pattern-key: Schema.type|enum:object
  schema-properties-present:
    description: 'Schema declares properties (measured: 100% of this contract)'
    severity: error
    given: $.components.schemas[*]
    then:
      field: properties
      function: defined
    x-pattern-key: Schema.properties|present

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/blocksigner-org-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.