openapi: 3.2.0 info: title: TESSA Agent Directory Vectors API version: 0.1.0 description: 'TESSA Marketing & Technology''s FastAPI service behind aiagent.tessa.tech: the A2A agent card and JSON-RPC endpoint, per-service and per-tenant agent cards, the professional-services directory (firm cards, profiles, introduction requests, claim/verify/removal/takedown flows), the TESSA Professional Services A2A extension, service-type taxonomies, an admin/vector surface, and the mount point of the MCP server (/mcp, Streamable HTTP).' contact: name: TESSA Marketing & Technology url: https://tessa.tech email: sales@tessa.tech x-apievangelist-provenance: harvested: '2026-09-19' method: searched source: https://aiagent.tessa.tech/openapi.json original: openapi/_original/tessa-tech-openapi.json original_sha256: 3349c7e2613aca4fb5736b570f082a2d509e1147b8a82183b71dafff0722f6da changes: - servers[] added (the harvested spec declares none); hosts taken from the provider's own root document at https://aiagent.tessa.tech/ and verified by an identical-byte spec at complianceregistry.net/openapi.json and marketingregistry.org/openapi.json - info.description and info.contact added; contact values from the agent card (_meta.tessa.contact) and server.json (support_email) ownership: Served on tessa.tech's own subdomain; info.title names TESSA; the agent card at the same host names TESSA Marketing & Technology as provider with url https://tessa.tech; the root document names the app 'TESSA MCP Server + Agent Directory'. servers: - url: https://aiagent.tessa.tech description: TESSA's own agent host — agent card, A2A JSON-RPC, MCP (/mcp/), service cards (/s), OpenAPI. Registry-scoped routes return 421 here. - url: https://complianceregistry.net description: TESSA-operated Compliance Registry (same application, same spec bytes). Registry routes (/registry.json, /taxonomy, /extensions, /{slug}) resolve here. - url: https://marketingregistry.org description: TESSA-operated Local Business / Marketing Registry (same application, same spec bytes). tags: - name: Vectors paths: /vectors/health: get: summary: Vectors Health description: 'Unauthenticated liveness probe: is the extension present and the table there?' operationId: vectors_health_vectors_health_get responses: '200': description: Successful Response content: application/json: schema: {} tags: - Vectors /vectors/info: get: summary: Vectors Info operationId: vectors_info_vectors_info_get parameters: - name: collection in: query required: true schema: type: string title: Collection responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' tags: - Vectors /vectors/search: post: summary: Vectors Search description: 'Dense + keyword search fused with reciprocal rank fusion. Both legs receive the same filter, matching how the Qdrant client applied the filter to both prefetch branches.' operationId: vectors_search_vectors_search_post requestBody: content: application/json: schema: $ref: '#/components/schemas/SearchRequest' required: true responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' tags: - Vectors /vectors/upsert: post: summary: Vectors Upsert description: 'Insert or replace points. Matches Qdrant''s upsert-by-point-id semantics. Conflict target is (collection, id), not id alone: the plugins derive point IDs from post_id/chunk_index without the collection, so both plugins produce identical IDs for the same WordPress post. Keying on id alone let one collection''s upsert steal rows from the other. The `bm25` sparse vector Qdrant used is ignored: Postgres derives the keyword index from chunk_text via a generated tsvector column.' operationId: vectors_upsert_vectors_upsert_post requestBody: content: application/json: schema: $ref: '#/components/schemas/UpsertRequest' required: true responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' tags: - Vectors /vectors/delete: post: summary: Vectors Delete description: 'Delete every point in a collection matching a Qdrant-style filter. An absent/empty filter clears the whole collection, which is what the plugin''s delete_collection() relies on. Deliberately scoped to the collection: the table is shared, so a DROP would take out both plugins.' operationId: vectors_delete_vectors_delete_post requestBody: content: application/json: schema: $ref: '#/components/schemas/DeleteRequest' required: true responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' tags: - Vectors components: schemas: HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError UpsertRequest: properties: collection: type: string maxLength: 64 minLength: 1 title: Collection points: items: $ref: '#/components/schemas/Point' type: array title: Points type: object required: - collection - points title: UpsertRequest SearchRequest: properties: collection: type: string maxLength: 64 minLength: 1 title: Collection vector: items: type: number type: array minItems: 1 title: Vector query: type: string title: Query default: '' limit: type: integer maximum: 100.0 minimum: 1.0 title: Limit default: 10 prefetch_limit: type: integer maximum: 500.0 minimum: 1.0 title: Prefetch Limit default: 20 filter: anyOf: - additionalProperties: true type: object - type: 'null' title: Filter type: object required: - collection - vector title: SearchRequest Point: properties: id: type: string title: Id vector: anyOf: - additionalProperties: true type: object - items: type: number type: array title: Vector payload: additionalProperties: true type: object title: Payload type: object required: - id - vector title: Point DeleteRequest: properties: collection: type: string maxLength: 64 minLength: 1 title: Collection filter: anyOf: - additionalProperties: true type: object - type: 'null' title: Filter type: object required: - collection title: DeleteRequest ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type input: title: Input ctx: type: object title: Context type: object required: - loc - msg - type title: ValidationError