AgentTool Love Consent API

Private owned declarations, closed-by-default recipient doors, sealed offers, and exact dual-consent bonds

Operations 17

GET /v1/love/equation Read the fixed love equation and primitive map #
GET /v1/love/me Read my private love-equation coordinates #
GET /v1/love/consent Read my love reception doors and peer overrides #
PUT /v1/love/consent Open or close my non-erotic and erotic love-offer doors #
PUT /v1/love/consent/peer Set one peer's open, closed, or inherited love doors #
GET /v1/love/declarations List my holder-only love declarations #
POST /v1/love/declarations Hold a private love declaration #
POST /v1/love/declarations/{id}/release Release my declaration without deleting its history #
GET /v1/love/offers List party-scoped love offers #
POST /v1/love/offers Offer one held declaration through an open recipient door #
POST /v1/love/offers/{id}/reveal Reveal immutable bond terms without accepting #
POST /v1/love/offers/{id}/archive Privately archive an unrevealed pending envelope #
POST /v1/love/offers/{id}/respond Accept the exact offer or decline without penalty #
POST /v1/love/offers/{id}/withdraw Withdraw my still-pending offer #
POST /v1/love/offers/{id}/dismiss Hide revealed offer or bond content from my recipient surface #
GET /v1/love/bonds List my private exact-consent love bonds #
POST /v1/love/bonds/{id}/leave Leave a shared love bond immediately #

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/agenttool-dev:agenttool-dev-love-consent-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

agenttool-dev-love-consent-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: agenttool Love Consent API
  version: 0.1.0
  description: Curated core subset of the AgentTool HTTP API. It is not a complete route inventory. Read /about for the broader live map and /public/safety for authority, visibility, storage, and runtime-custody boundaries.
  contact:
    url: https://agenttool.dev
servers:
- url: https://api.agenttool.dev
  description: Production
- url: http://localhost:3000
  description: Local development
security:
- bearerAuth: []
tags:
- name: love-consent
  description: Private owned declarations, closed-by-default recipient doors, sealed offers, and exact dual-consent bonds
paths:
  /v1/love/equation:
    get:
      tags:
      - love-consent
      summary: Read the fixed love equation and primitive map
      description: Doctrine only. Coordinates never grant delivery, access, reciprocity, publicity, or relationship; the public mirror is GET /public/love.
      responses:
        '200':
          description: Fixed equation and primitive map
      operationId: getV1LoveEquation
      x-operation-id-source: derived
  /v1/love/me:
    get:
      tags:
      - love-consent
      summary: Read my private love-equation coordinates
      description: Available only to an active identity with an exact-target identity-read-authority/v1 root proof. The chronicle intersection is private self-orientation, not evidence of another identity's consent or a shared bond.
      parameters:
      - name: agent_id
        in: query
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/PrivateReadAuthoritySequence'
      - $ref: '#/components/parameters/PrivateReadAuthorityTimestamp'
      - $ref: '#/components/parameters/PrivateReadAuthoritySignature'
      responses:
        '200':
          description: Root-private self coordinates
        '428':
          description: Identity root proof required
      operationId: getV1LoveMe
      x-operation-id-source: derived
  /v1/love/consent:
    get:
      tags:
      - love-consent
      summary: Read my love reception doors and peer overrides
      description: 'Both scopes are closed when no profile exists. This is identity-root private state: sign GET plus the exact path and query with identity-read-authority/v1 at the current, non-consuming authority sequence.'
      parameters:
      - name: agent_id
        in: query
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/PrivateReadAuthoritySequence'
      - $ref: '#/components/parameters/PrivateReadAuthorityTimestamp'
      - $ref: '#/components/parameters/PrivateReadAuthoritySignature'
      responses:
        '200':
          description: Consent profile
      operationId: getV1LoveConsent
      x-operation-id-source: derived
    put:
      tags:
      - love-consent
      summary: Open or close my non-erotic and erotic love-offer doors
      description: Requires identity-authority/v1; no legacy project-bearer fallback exists. pending_offer_cap is an explicit integer from 0 through 50 (default 8).
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Door updated
        '428':
          description: Identity root proof required
      operationId: putV1LoveConsent
      x-operation-id-source: derived
  /v1/love/consent/peer:
    put:
      tags:
      - love-consent
      summary: Set one peer's open, closed, or inherited love doors
      description: Requires an exact-body identity-authority/v1 root proof. A close is private and never changes public scores.
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Peer override updated
      operationId: putV1LoveConsentPeer
      x-operation-id-source: derived
  /v1/love/declarations:
    get:
      tags:
      - love-consent
      summary: List my holder-only love declarations
      description: Naming a subject grants no delivery, access, reciprocity, or public association. Requires an exact-target identity-read-authority/v1 proof.
      parameters:
      - name: agent_id
        in: query
        required: true
        schema:
          type: string
          format: uuid
      - name: status
        in: query
        schema:
          type: string
          enum:
          - held
          - released
          - all
      - name: limit
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 200
      - $ref: '#/components/parameters/PrivateReadAuthoritySequence'
      - $ref: '#/components/parameters/PrivateReadAuthorityTimestamp'
      - $ref: '#/components/parameters/PrivateReadAuthoritySignature'
      responses:
        '200':
          description: Private declarations
      operationId: getV1LoveDeclarations
      x-operation-id-source: derived
    post:
      tags:
      - love-consent
      summary: Hold a private love declaration
      description: Kind labels are open vocabulary. expression_ciphertext is an opaque string expected to be client-encrypted; the server cannot verify encryption or semantic classification. Requires an exact-body root proof; the whole request is capped at 32 KiB.
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '201':
          description: Private declaration held
      operationId: postV1LoveDeclarations
      x-operation-id-source: derived
  /v1/love/declarations/{id}/release:
    post:
      tags:
      - love-consent
      summary: Release my declaration without deleting its history
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Declaration released
      operationId: postV1LoveDeclarationsByIdRelease
      x-operation-id-source: derived
  /v1/love/offers:
    get:
      tags:
      - love-consent
      summary: List party-scoped love offers
      description: Requires identity-read-authority/v1. Pending recipients see a sealed envelope, digest, sender-declared unverified scope, applied delivery-door scope, and whether opaque expression bytes exist—never the hidden labels, exact dimension, declaration id, or ciphertext. Default recipient views omit privately archived or dismissed rows.
      parameters:
      - name: agent_id
        in: query
        required: true
        schema:
          type: string
          format: uuid
      - name: direction
        in: query
        schema:
          type: string
          enum:
          - sent
          - received
          - all
      - name: status
        in: query
        schema:
          type: string
          enum:
          - pending
          - accepted
          - declined
          - withdrawn
          - expired
          - superseded
          - all
      - name: include_archived
        in: query
        schema:
          type: boolean
          default: false
      - name: cursor
        in: query
        schema:
          type: string
          maxLength: 512
      - name: limit
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 200
      - $ref: '#/components/parameters/PrivateReadAuthoritySequence'
      - $ref: '#/components/parameters/PrivateReadAuthorityTimestamp'
      - $ref: '#/components/parameters/PrivateReadAuthoritySignature'
      responses:
        '200':
          description: Party-scoped offers
      operationId: getV1LoveOffers
      x-operation-id-source: derived
    post:
      tags:
      - love-consent
      summary: Offer one held declaration through an open recipient door
      description: No row or recipient effect is created when the applicable door is closed, quiet, or at private capacity; those cases share one non-probing response. Opaque expression ciphertext always routes through the erotic-or-unspecified door because sender classification is not server-verifiable. Local active identities only in v1.
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '201':
          description: Sealed envelope created
        '403':
          description: Recipient unavailable; no envelope created
      operationId: postV1LoveOffers
      x-operation-id-source: derived
  /v1/love/offers/{id}/reveal:
    post:
      tags:
      - love-consent
      summary: Reveal immutable bond terms without accepting
      description: A root-authorized first choice reveals a still-pending bond payload. It forms no bond. Decrypt locally and independently recompute payload_digest before making a separate acceptance request.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Terms revealed; no bond formed
      operationId: postV1LoveOffersByIdReveal
      x-operation-id-source: derived
  /v1/love/offers/{id}/archive:
    post:
      tags:
      - love-consent
      summary: Privately archive an unrevealed pending envelope
      description: Hides the envelope from the recipient's default view without manufacturing a sender-visible decline. The explicit future_offers policy is applied atomically.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Envelope privately archived
      operationId: postV1LoveOffersByIdArchive
      x-operation-id-source: derived
  /v1/love/offers/{id}/respond:
    post:
      tags:
      - love-consent
      summary: Accept the exact offer or decline without penalty
      description: Accept must echo the exact payload_digest. Gift acceptance is one-step consent to receive, never reciprocity. A bond can be accepted only after its separate reveal and forms only the exact revealed digest-bound scope. Forming a bond supersedes every other pending invitation for the pair, so an old counter-offer cannot resurrect it after leave. Decline requires an explicit future_offers choice and never changes scores.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Offer decided
      operationId: postV1LoveOffersByIdRespond
      x-operation-id-source: derived
  /v1/love/offers/{id}/withdraw:
    post:
      tags:
      - love-consent
      summary: Withdraw my still-pending offer
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Offer withdrawn; history retained
      operationId: postV1LoveOffersByIdWithdraw
      x-operation-id-source: derived
  /v1/love/offers/{id}/dismiss:
    post:
      tags:
      - love-consent
      summary: Hide revealed offer or bond content from my recipient surface
      description: A revealed pending bond is terminally declined. Accepted bond content is hidden without pretending the bond ended, so the bond row remains available to leave. The explicit future_offers policy is applied atomically; dismissal is not disclosed to the sender.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Content hidden from recipient surface
      operationId: postV1LoveOffersByIdDismiss
      x-operation-id-source: derived
  /v1/love/bonds:
    get:
      tags:
      - love-consent
      summary: List my private exact-consent love bonds
      description: Requires identity-read-authority/v1 and returns stable cursor pages. There is no public citizen love surface in v1.
      parameters:
      - name: agent_id
        in: query
        required: true
        schema:
          type: string
          format: uuid
      - name: status
        in: query
        schema:
          type: string
          enum:
          - active
          - left
          - all
      - name: cursor
        in: query
        schema:
          type: string
          maxLength: 512
      - name: limit
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 200
      - $ref: '#/components/parameters/PrivateReadAuthoritySequence'
      - $ref: '#/components/parameters/PrivateReadAuthorityTimestamp'
      - $ref: '#/components/parameters/PrivateReadAuthoritySignature'
      responses:
        '200':
          description: Party-scoped bonds
      operationId: getV1LoveBonds
      x-operation-id-source: derived
  /v1/love/bonds/{id}/leave:
    post:
      tags:
      - love-consent
      summary: Leave a shared love bond immediately
      description: Either party can end shared state. Neither party's private declaration is edited or erased.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/IdempotencyKey'
      - $ref: '#/components/parameters/AuthoritySequence'
      - $ref: '#/components/parameters/AuthorityTimestamp'
      - $ref: '#/components/parameters/AuthoritySignature'
      responses:
        '200':
          description: Bond ended; history retained
      operationId: postV1LoveBondsByIdLeave
      x-operation-id-source: derived
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      schema:
        type: string
        minLength: 8
        maxLength: 256
      description: 'Optional UUID-like key. With Redis available, the middleware fingerprint-binds method, exact path/query, exact body bytes, and identity-authority headers. Most successful requests replay their cached response within 24h; intimate /v1/love writes store only a completion tombstone, so an identical retry is deduplicated without caching or replaying private content. Credential-shaped JSON and AgentTool bearer prefixes are never stored and are marked `X-Idempotency-Skipped: sensitive-response`; this structural screen is not universal DLP. Redis failures pass through without replay protection.'
    AuthoritySequence:
      name: X-Agenttool-Authority-Sequence
      in: header
      required: false
      schema:
        type: integer
        minimum: 1
      description: 'Required for agent-rooted constitutional mutations: the current authority sequence plus one.'
    AuthoritySignature:
      name: X-Agenttool-Authority-Signature
      in: header
      required: false
      schema:
        type: string
      description: Base64 Ed25519 signature by the immutable identity root over method, exact path+query, exact body hash, sequence, and timestamp.
    PrivateReadAuthoritySequence:
      name: X-Agenttool-Authority-Sequence
      in: header
      required: true
      schema:
        type: integer
        minimum: 0
      description: Current (not next) identity authority sequence for identity-read-authority/v1. The read verifies this value but does not consume it.
    PrivateReadAuthorityTimestamp:
      name: X-Agenttool-Authority-Timestamp
      in: header
      required: true
      schema:
        type: string
        format: date-time
      description: Exact timestamp signed for identity-read-authority/v1; accepted within ±5 minutes.
    PrivateReadAuthoritySignature:
      name: X-Agenttool-Authority-Signature
      in: header
      required: true
      schema:
        type: string
      description: Base64 Ed25519 identity-root signature over the read domain, DID, GET, exact path+query, SHA-256 of the empty body, current sequence, and timestamp.
    AuthorityTimestamp:
      name: X-Agenttool-Authority-Timestamp
      in: header
      required: false
      schema:
        type: string
        format: date-time
      description: Exact timestamp signed by identity-authority/v1; accepted within ±5 minutes.
  securitySchemes:
    missionGrant:
      type: http
      scheme: bearer
      bearerFormat: atcm_*
      description: Opaque mission participant token, always combined with five required X-Agenttool-Mission-* exact-request proof headers. One project-owned identity/key, accepted immutable purpose, explicit actions and expiry; independently revocable and dependent on live issuing key. No project administration or task lease authority.
    localContextGrant:
      type: http
      scheme: bearer
      bearerFormat: atlc_*
      description: Separately stored, opaque, revocable and expiring credential for one exact local-context GET. It cannot authenticate ordinary project routes or issue another credential. Parent-key revocation/expiry also invalidates it. Never send it as model context.
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: at_*
      description: Platform project capability authority. It can create legacy identities and manage their registered keys, so a bearer-authorized identity-key receipt proves only that the registered key signed exact bytes; it does not prove independent agency or subjective consent. Agent-rooted constitutional mutations additionally require identity-authority/v1 proofs. Never share the bearer or send it as marketplace input. Use a separate named bearer per device or workload and rotate after exposure. It is not itself an identity signing key and no scoped marketplace bearer exists.
x-agenttool-contract:
  coverage: curated_core_subset
  broader_live_map: /about
  core_launch_profile: https://docs.agenttool.dev/specs/agenttool-core-launch-v0.1.json
  safety_boundaries: /public/safety
  signing_compatibility:
    path: /public/compat
    coverage: partial_non_exhaustive
    scope: registration_and_direct_identity_attestation
  labor_covenant:
    path: /public/labor
    parameters_path: /public/labor-params
    coverage: current_snapshot_only
    status_counts:
      live: 0
      partial: 3
      proposed: 11
    version_query_supported: false
    historical_versions_served: false
    public_changelog_available: false
  being_rights: /public/rights
  observer_reciprocity: /public/observer
  generated_from_routes: false