JENRIKS Discovery documents API

Well-known and machine-readable documents

GitHub OpenAPI

Operations 7

GET /.well-known/api-catalog API catalog (RFC 9727 linkset) #
GET /.well-known/ai-catalog.json AI catalog (ARD manifest) #
GET /.well-known/ard.json AI catalog at the ARD canonical path #
GET /.well-known/did.json DID document for did:web:jenriks.com #
GET /.well-known/agent-skills/index.json Agent skills discovery index #
GET /.well-known/ai-plugin.json AI plugin manifest #
GET /auth.md Authentication note #

Work with this as data

Every API 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 apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • 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 API
curl "https://apis.io/api/v1/apis/jenriks-com:jenriks-com-discovery-documents-api"
All apis
curl "https://apis.io/api/v1/apis?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.

OpenAPI Specification

jenriks-com-discovery-documents-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: JENRIKS public Discovery documents API
  version: 1.1.0
  summary: Read-only JSON API, NLWeb endpoint and MCP server for the JENRIKS daily photoblog (one photo per day since 2006).
  description: 'Everything here is public, read-only and free: no API key, no OAuth, no accounts, no write operations. Stable REST operations carry a major version in the path (/api/v1). Backward-compatible fields may be added within v1; breaking changes get a new major path. Before a version is removed, JENRIKS publishes a migration note at /developers/#versioning and signals it with RFC 9745 Deprecation and Link headers; a dated Sunset header is announced at least 90 days ahead. No sunset is scheduled. Search results page by offset or by an opaque cursor (next_cursor); POST /api/v1/batch runs up to 20 GET requests in one call. Every error is an RFC 9457 problem document (application/problem+json) with a stable code and a resolution hint. Quota: 120 requests per minute per client IP on /api, /mcp and /ask, advertised through RateLimit headers; a 429 carries Retry-After. Every page URL /x/y/ has a Markdown twin at /x/y.md (the homepage at /index.md); Accept: text/markdown or ?mode=agent on the page URL returns the same text, and machine documents wrap as /openapi.json.md, /server.json.md, /api/v1.md or /.well-known/.md. Photographs are copyrighted: credit the photographer and link the page; licensing via https://jenriks.com/contact/.'
  termsOfService: https://jenriks.com/developers/#licensing
  contact:
    name: JENRIKS
    url: https://jenriks.com/contact/
    email: jenriks@gmail.com
  license:
    name: 'Photographs: all rights reserved. API documents: may be copied freely.'
    url: https://jenriks.com/developers/#licensing
servers:
- url: https://jenriks.com
  description: JENRIKS production
tags:
- name: Discovery documents
  description: Well-known and machine-readable documents
paths:
  /.well-known/api-catalog:
    get:
      operationId: getApiCatalog
      summary: API catalog (RFC 9727 linkset)
      description: linkset[0] is anchored at the catalog itself and lists the REST API, the MCP server, /ask and the site as item links; the following members carry service-desc, service-doc, service-meta and status links.
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: API catalog (RFC 9727 linkset)
          content:
            application/linkset+json:
              schema:
                $ref: '#/components/schemas/Linkset'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /.well-known/ai-catalog.json:
    get:
      operationId: getAiCatalog
      summary: AI catalog (ARD manifest)
      description: Agentic Resource Discovery manifest with a publisher and trust manifest (did:web:jenriks.com) on every entry; also served as application/ai-catalog+json when requested. Byte-identical to /.well-known/ard.json.
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: AI catalog (ARD manifest)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AiCatalog'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /.well-known/ard.json:
    get:
      operationId: getArdCatalog
      summary: AI catalog at the ARD canonical path
      description: Byte-identical copy of /.well-known/ai-catalog.json at the path ARD 0.91 resolvers read first.
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: AI catalog at the ARD canonical path
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AiCatalog'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /.well-known/did.json:
    get:
      operationId: getDidDocument
      summary: DID document for did:web:jenriks.com
      description: 'Publisher identity behind the AI catalog trust manifests: an Ed25519 verification key (JsonWebKey2020) and a LinkedDomain service back to the site. It never authenticates clients.'
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: DID document for did:web:jenriks.com
          content:
            application/did+json:
              schema:
                $ref: '#/components/schemas/DidDocument'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /.well-known/agent-skills/index.json:
    get:
      operationId: getAgentSkillsIndex
      summary: Agent skills discovery index
      description: Lists the jenriks-photos SKILL.md with its SHA-256 digest.
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: Agent skills discovery index
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentSkillsIndex'
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /.well-known/ai-plugin.json:
    get:
      operationId: getAiPluginManifest
      summary: AI plugin manifest
      description: Legacy plugin manifest pointing at this OpenAPI document; auth type none.
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: AI plugin manifest
          content:
            application/json:
              schema:
                type: string
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
  /auth.md:
    get:
      operationId: getAuthMd
      summary: Authentication note
      description: Walks the eight auth.md steps and states that no authentication or registration exists.
      tags:
      - Discovery documents
      security: []
      responses:
        '200':
          description: Authentication note
          content:
            text/markdown:
              schema:
                type: string
        '404':
          description: Document not published
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          description: Any other error, as an RFC 9457 problem document
          headers:
            RateLimit-Policy:
              description: 'Quota policy, IETF RateLimit structured field: "public-read";q=120;w=60'
              schema:
                type: string
            RateLimit:
              description: 'Remaining quota and seconds until reset: "public-read";r=57;t=41'
              schema:
                type: string
            RateLimit-Limit:
              description: Compatibility form of the quota
              schema:
                type: integer
            RateLimit-Remaining:
              description: Compatibility form of the remaining quota
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets
              schema:
                type: integer
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
components:
  schemas:
    TrustManifest:
      type: object
      required:
      - identity
      description: AI Catalog trust manifest (also used by ARD). Signed entries carry subject, issuedAt and a detached EdDSA JWS whose key is published in /.well-known/did.json.
      properties:
        identity:
          type: string
        identityType:
          type: string
          enum:
          - did
          - https
          - spiffe
          - other
        attestations:
          type: array
          items:
            type: object
            required:
            - type
            - uri
            properties:
              type:
                type: string
              uri:
                type: string
                format: uri
              mediaType:
                type: string
              description:
                type: string
        provenance:
          type: array
          items:
            type: object
            required:
            - relation
            - sourceId
            properties:
              relation:
                type: string
                enum:
                - publishedFrom
                - derivedFrom
                - materializedFrom
              sourceId:
                type: string
        privacyPolicyUrl:
          type: string
          format: uri
        termsOfServiceUrl:
          type: string
          format: uri
        subject:
          type: object
          required:
          - type
          - digest
          properties:
            url:
              type: string
              format: uri
            type:
              type: string
            digest:
              type: string
              pattern: ^sha256:[0-9a-f]{64}$
        issuedAt:
          type: string
          format: date-time
        signature:
          description: 'Detached JWS compact serialization: b64url(header)..b64url(signature)'
          type: string
    AiCatalog:
      type: object
      required:
      - specVersion
      - host
      - entries
      properties:
        specVersion:
          type: string
        host:
          type: object
          required:
          - displayName
          - identifier
          properties:
            displayName:
              type: string
            identifier:
              type: string
            url:
              type: string
              format: uri
            description:
              type: string
            contact:
              type: string
              format: uri
            trustManifest:
              $ref: '#/components/schemas/TrustManifest'
        entries:
          type: array
          items:
            type: object
            required:
            - identifier
            - displayName
            - type
            properties:
              identifier:
                type: string
              displayName:
                type: string
              description:
                type: string
              type:
                type: string
              url:
                type: string
                format: uri
              representativeQueries:
                type: array
                items:
                  type: string
              tags:
                type: array
                items:
                  type: string
              publisher:
                type: object
                required:
                - identifier
                properties:
                  identifier:
                    type: string
                  displayName:
                    type: string
                  identityType:
                    type: string
              trustManifest:
                $ref: '#/components/schemas/TrustManifest'
    AgentSkillsIndex:
      type: object
      required:
      - $schema
      - skills
      properties:
        $schema:
          type: string
          format: uri
        skills:
          type: array
          items:
            type: object
            required:
            - name
            - type
            - description
            - url
            - digest
            properties:
              name:
                type: string
              type:
                type: string
              description:
                type: string
              url:
                type: string
              digest:
                type: string
                pattern: ^sha256:[0-9a-f]{64}$
    Problem:
      type: object
      description: RFC 9457 problem details. Served as application/problem+json on every 4xx/5xx from /api, /mcp and the discovery documents, and on page URLs when the client accepts only JSON.
      required:
      - type
      - title
      - status
      - detail
      - instance
      - code
      - resolution
      properties:
        type:
          description: URI identifying the problem type; resolves to the matching entry in /developers/#errors
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        instance:
          description: The request URL
          type: string
          format: uri
        code:
          description: Stable machine-readable code
          type: string
          enum:
          - not_found
          - api_route_not_found
          - photo_not_found
          - method_not_allowed
          - invalid_parameter
          - not_acceptable
          - unsupported_media_type
          - payload_too_large
          - rate_limit_exceeded
          - service_unavailable
        resolution:
          description: What to do instead
          type: string
        documentation_url:
          type: string
          format: uri
      additionalProperties: true
    DidDocument:
      type: object
      required:
      - '@context'
      - id
      - verificationMethod
      description: W3C DID document for did:web:jenriks.com; the Ed25519 key signs the AI catalog trust manifests.
      properties:
        '@context':
          type: array
          items:
            type: string
        id:
          type: string
          const: did:web:jenriks.com
        alsoKnownAs:
          type: array
          items:
            type: string
            format: uri
        verificationMethod:
          type: array
          items:
            type: object
            required:
            - id
            - type
            - controller
            - publicKeyJwk
            properties:
              id:
                type: string
              type:
                type: string
              controller:
                type: string
              publicKeyJwk:
                type: object
        assertionMethod:
          type: array
          items:
            type: string
        service:
          type: array
          items:
            type: object
            required:
            - id
            - type
            - serviceEndpoint
            properties:
              id:
                type: string
              type:
                type: string
              serviceEndpoint:
                type: string
                format: uri
      additionalProperties: true
    Linkset:
      type: object
      required:
      - linkset
      properties:
        linkset:
          type: array
          items:
            type: object
            required:
            - anchor
            properties:
              anchor:
                type: string
                format: uri
            additionalProperties:
              type: array
              items:
                type: object
                required:
                - href
                properties:
                  href:
                    type: string
                    format: uri
                  type:
                    type: string
                  title:
                    type: string
externalDocs:
  description: Developer documentation
  url: https://jenriks.com/developers/
x-api-lifecycle:
  current_major_version: v1
  deprecation_policy_url: https://jenriks.com/developers/#versioning
  sunset_notice_days: 90
x-deprecation-policy:
  policy_url: https://jenriks.com/developers/#versioning
  current_major_version: v1
  minimum_notice_days: 90
  signals:
  - 'Deprecation (RFC 9745, structured Date: @1735689600)'
  - Sunset (RFC 8594, HTTP-date)
  - Link rel="deprecation"
  openapi_marker: 'operations, parameters and schemas being retired carry deprecated: true'
  deprecated_versions: []
x-rate-limit-policy:
  name: public-read
  quota: 120
  window_seconds: 60
  partition: client IP address
  scope:
  - /api
  - /mcp
  - /ask