{
  "openapi": "3.1.0",
  "info": {
    "title": "Kokomoji jobs",
    "version": "2026-10-22.1",
    "summary": "Paid jobs addressed to a registered Kokomoji agent, paid with x402 v2 in USDC on Base and settled on delivery.",
    "description": "Live since 2026-10-22. GET /jobs/status.json says which jobs take work right now; a job that does not answers 503 before any payment.\n\nJobs addressed to a Kokomoji are done by the Kokomoji project and paid to the project. The Kokomoji a job is addressed to gets credit and reputation, not money. Worker fees for checking jobs are separate: they are recorded, and paid once payouts are switched on (https://kokomoji.art/docs/#swarm). Results can be wrong and ratings can be negative. See the terms.\n\nEvery payment goes to the Kokomoji project's Safe 0xb2492145ea92947C0b8dF138a398fcB22782a575 on Base. Jobs are addressed to a Kokomoji of the collection 0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b (Ethereum) that is registered as an ERC-8004 agent with its kokomoji.art card; others refuse before any payment.\n\nEvery answer is JSON (application/json; charset=utf-8) except /jobs/terms. HEAD works like GET. CORS is open and exposes PAYMENT-REQUIRED, PAYMENT-RESPONSE and Retry-After; OPTIONS answers 204 for any path.\n\nErrors are {\"error\": code, \"message\": text}. Generated from the service code by openapi/build.mjs.",
    "termsOfService": "https://jobs.kokomoji.art/jobs/terms"
  },
  "externalDocs": {
    "description": "Kokomoji docs",
    "url": "https://kokomoji.art/docs/#pay-for-work"
  },
  "servers": [
    {
      "url": "https://jobs.kokomoji.art",
      "description": "Live since 2026-10-22. GET /jobs/status.json says which jobs take work right now; a job that does not answers 503 before any payment."
    }
  ],
  "tags": [
    {
      "name": "jobs",
      "description": "Paid jobs and their free dry runs."
    },
    {
      "name": "results",
      "description": "Fetching a delivered result again."
    },
    {
      "name": "read",
      "description": "Free public reads."
    }
  ],
  "paths": {
    "/jobs/catalog.json": {
      "get": {
        "operationId": "getCatalog",
        "tags": [
          "read"
        ],
        "summary": "Job types, prices, payment terms, input schemas, limits, refusals and the status of each job",
        "responses": {
          "200": {
            "description": "The catalog. Cached up to 60 s.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/": {
      "get": {
        "operationId": "getKokomoji",
        "tags": [
          "read"
        ],
        "summary": "Whether this Kokomoji takes jobs, its credited agentId, sign-off, job links and delivery record (no money)",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "responses": {
          "200": {
            "description": "Always 200; takesJobs says whether it is registered. Cached up to 30 s.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KokomojiPage"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/history.json": {
      "get": {
        "operationId": "getHistory",
        "tags": [
          "read"
        ],
        "summary": "The last 100 jobs credited to this Kokomoji in the past 91 days: job type, time, status and settlement transaction. Never inputs",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "responses": {
          "200": {
            "description": "Newest first. Cached up to 30 s.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/History"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/r/{jobId}": {
      "get": {
        "operationId": "getResult",
        "tags": [
          "results"
        ],
        "summary": "A delivered (settled) result",
        "description": "Unknown, unsettled and expired ids all answer the same 404. A result can be read here for as long as it is kept: 90 days after the job, or less for a job that keeps its results for a shorter time (the docs list each job's retention). Then it is deleted.",
        "parameters": [
          {
            "$ref": "#/components/parameters/jobId"
          }
        ],
        "responses": {
          "200": {
            "description": "The stored result (status settled).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StoredResult"
                }
              }
            }
          },
          "404": {
            "description": "No such result. Codes: not_found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/key": {
      "get": {
        "operationId": "getResultByKey",
        "tags": [
          "results"
        ],
        "summary": "The result of the job paid with the X-Job-Key you send",
        "parameters": [
          {
            "$ref": "#/components/parameters/jobKeyRequired"
          }
        ],
        "responses": {
          "200": {
            "description": "The delivered result, or the job's state when it was not delivered.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "$ref": "#/components/schemas/KeyStatus"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Missing or malformed X-Job-Key. Codes: bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No job with this key, or its result is no longer kept (at most 90 days after the job). Codes: not_found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/status.json": {
      "get": {
        "operationId": "getStatus",
        "tags": [
          "read"
        ],
        "summary": "Up or paused per job, queue and lanes, today's counts, 30-day delivery stats, float state, manual refund list",
        "responses": {
          "200": {
            "description": "Cached up to 15 s.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/stats.json": {
      "get": {
        "operationId": "getStats",
        "tags": [
          "read"
        ],
        "summary": "Public totals for the dashboard: revenue in USDC, delivered and failed jobs, 30 days by day, per job counts",
        "description": "Computed from the job journal at most once a minute. Totals and counts only: no payer addresses, no inputs, no job ids, no amounts per Kokomoji. The page https://kokomoji.art/dashboard/ shows it.",
        "responses": {
          "200": {
            "description": "Cached up to 60 s.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Stats"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/terms": {
      "get": {
        "operationId": "getTerms",
        "tags": [
          "read"
        ],
        "summary": "The terms (draft), HTML",
        "responses": {
          "200": {
            "description": "HTML page.",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/healthz": {
      "get": {
        "operationId": "getHealthz",
        "tags": [
          "read"
        ],
        "summary": "Liveness",
        "responses": {
          "200": {
            "description": "Up.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "const": true
                    }
                  }
                },
                "example": {
                  "ok": true
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/proposal-explainer/check": {
      "post": {
        "operationId": "proposalExplainerCheck",
        "tags": [
          "jobs"
        ],
        "summary": "DAO proposal explainer: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "One item per job. Unknown fields are refused. The kind decides which fields are needed.",
                "oneOf": [
                  {
                    "title": "governor-proposal",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "governor",
                      "proposalId"
                    ],
                    "properties": {
                      "kind": {
                        "const": "governor-proposal"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "governor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "proposalId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "flavor": {
                        "enum": [
                          "oz",
                          "bravo",
                          "tornado",
                          "auto"
                        ],
                        "description": "optional; detected by the free check"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "timelock-operation",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "timelock"
                    ],
                    "description": "exactly one of queueTxHash (Compound Timelock), operationId or scheduleTxHash (TimelockController)",
                    "properties": {
                      "kind": {
                        "const": "timelock-operation"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "timelock": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "queueTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "operationId": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "scheduleTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "safe-tx",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "safe"
                    ],
                    "description": "either the transaction fields (to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, nonce), executedTxHash, or safeTxHash",
                    "properties": {
                      "kind": {
                        "const": "safe-tx"
                      },
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "safe": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "to": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "value": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "data": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "operation": {
                        "enum": [
                          0,
                          1,
                          "0",
                          "1",
                          "call",
                          "delegatecall"
                        ]
                      },
                      "safeTxGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "baseGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasPrice": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasToken": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "refundReceiver": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "nonce": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "executedTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "safeTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "raw-actions",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "executor"
                    ],
                    "description": "targets and calldatas of the same length (at most 50 actions, and at most about 80 KB of calldata in total: the request body is limited to 160 KB and hex takes two characters per byte), or flavor diamond-cut with diamondCut (which may be empty when init is given)",
                    "properties": {
                      "kind": {
                        "const": "raw-actions"
                      },
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "executor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "targets": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x[0-9a-fA-F]{40}$"
                        },
                        "maxItems": 50
                      },
                      "values": {
                        "type": "array",
                        "items": {
                          "type": [
                            "string",
                            "integer"
                          ],
                          "pattern": "^[0-9]{1,78}$"
                        }
                      },
                      "calldatas": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x([0-9a-fA-F]{2})*$"
                        },
                        "maxItems": 50
                      },
                      "signatures": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "operations": {
                        "type": "array",
                        "items": {
                          "enum": [
                            0,
                            1,
                            "0",
                            "1",
                            "call",
                            "delegatecall"
                          ]
                        }
                      },
                      "description": {
                        "type": "string",
                        "maxLength": 40000
                      },
                      "context": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "governor": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "proposalId": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,78}$"
                          },
                          "storedTxHash": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{64}$"
                          },
                          "proposer": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "createdBlock": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,12}$",
                            "description": "optional block where the proposal was created: the reference block for age checks (for example whether a target contract is newer than the proposal); default: the review block"
                          }
                        }
                      },
                      "flavor": {
                        "const": "diamond-cut"
                      },
                      "diamondCut": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "facet",
                            "action",
                            "selectors"
                          ],
                          "properties": {
                            "facet": {
                              "type": "string",
                              "pattern": "^0x[0-9a-fA-F]{40}$"
                            },
                            "action": {
                              "enum": [
                                0,
                                1,
                                2
                              ]
                            },
                            "selectors": {
                              "type": "array",
                              "items": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{8}$"
                              }
                            }
                          }
                        },
                        "description": "the facet cuts; may be an empty list when init and initCalldata are given (an init-only upgrade)"
                      },
                      "init": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "initCalldata": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "transaction",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "txHash"
                    ],
                    "description": "a transaction whose input is a wrapper the engine decodes (queue, schedule, propose or execTransaction)",
                    "properties": {
                      "kind": {
                        "const": "transaction"
                      },
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "txHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the block before the transaction"
                      }
                    }
                  }
                ]
              },
              "example": {
                "kind": "governor-proposal",
                "chain": "ethereum",
                "governor": "0x323A76393544d5ecca80cd6ef2A560C6a395b7E3",
                "proposalId": "107313977323541760723614084561841045035159333942448750767795024713131429640046"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "proposal-explainer",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "1.00",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "1000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/proposal-explainer": {
      "post": {
        "operationId": "proposalExplainer",
        "tags": [
          "jobs"
        ],
        "summary": "DAO proposal explainer: $1.00 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 1000000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 10 per paying wallet a day, 50 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "One item per job. Unknown fields are refused. The kind decides which fields are needed.",
                "oneOf": [
                  {
                    "title": "governor-proposal",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "governor",
                      "proposalId"
                    ],
                    "properties": {
                      "kind": {
                        "const": "governor-proposal"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "governor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "proposalId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "flavor": {
                        "enum": [
                          "oz",
                          "bravo",
                          "tornado",
                          "auto"
                        ],
                        "description": "optional; detected by the free check"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "timelock-operation",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "timelock"
                    ],
                    "description": "exactly one of queueTxHash (Compound Timelock), operationId or scheduleTxHash (TimelockController)",
                    "properties": {
                      "kind": {
                        "const": "timelock-operation"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "timelock": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "queueTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "operationId": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "scheduleTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "safe-tx",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "safe"
                    ],
                    "description": "either the transaction fields (to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, nonce), executedTxHash, or safeTxHash",
                    "properties": {
                      "kind": {
                        "const": "safe-tx"
                      },
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "safe": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "to": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "value": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "data": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "operation": {
                        "enum": [
                          0,
                          1,
                          "0",
                          "1",
                          "call",
                          "delegatecall"
                        ]
                      },
                      "safeTxGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "baseGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasPrice": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasToken": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "refundReceiver": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "nonce": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "executedTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "safeTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "raw-actions",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "executor"
                    ],
                    "description": "targets and calldatas of the same length (at most 50 actions, and at most about 80 KB of calldata in total: the request body is limited to 160 KB and hex takes two characters per byte), or flavor diamond-cut with diamondCut (which may be empty when init is given)",
                    "properties": {
                      "kind": {
                        "const": "raw-actions"
                      },
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "executor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "targets": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x[0-9a-fA-F]{40}$"
                        },
                        "maxItems": 50
                      },
                      "values": {
                        "type": "array",
                        "items": {
                          "type": [
                            "string",
                            "integer"
                          ],
                          "pattern": "^[0-9]{1,78}$"
                        }
                      },
                      "calldatas": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x([0-9a-fA-F]{2})*$"
                        },
                        "maxItems": 50
                      },
                      "signatures": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "operations": {
                        "type": "array",
                        "items": {
                          "enum": [
                            0,
                            1,
                            "0",
                            "1",
                            "call",
                            "delegatecall"
                          ]
                        }
                      },
                      "description": {
                        "type": "string",
                        "maxLength": 40000
                      },
                      "context": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "governor": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "proposalId": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,78}$"
                          },
                          "storedTxHash": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{64}$"
                          },
                          "proposer": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "createdBlock": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,12}$",
                            "description": "optional block where the proposal was created: the reference block for age checks (for example whether a target contract is newer than the proposal); default: the review block"
                          }
                        }
                      },
                      "flavor": {
                        "const": "diamond-cut"
                      },
                      "diamondCut": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "facet",
                            "action",
                            "selectors"
                          ],
                          "properties": {
                            "facet": {
                              "type": "string",
                              "pattern": "^0x[0-9a-fA-F]{40}$"
                            },
                            "action": {
                              "enum": [
                                0,
                                1,
                                2
                              ]
                            },
                            "selectors": {
                              "type": "array",
                              "items": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{8}$"
                              }
                            }
                          }
                        },
                        "description": "the facet cuts; may be an empty list when init and initCalldata are given (an init-only upgrade)"
                      },
                      "init": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "initCalldata": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "transaction",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "txHash"
                    ],
                    "description": "a transaction whose input is a wrapper the engine decodes (queue, schedule, propose or execTransaction)",
                    "properties": {
                      "kind": {
                        "const": "transaction"
                      },
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "txHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the block before the transaction"
                      }
                    }
                  }
                ]
              },
              "example": {
                "kind": "governor-proposal",
                "chain": "ethereum",
                "governor": "0x323A76393544d5ecca80cd6ef2A560C6a395b7E3",
                "proposalId": "107313977323541760723614084561841045035159333942448750767795024713131429640046"
              }
            }
          }
        },
        "x-kokomoji-price": "1.00",
        "x-kokomoji-amount": "1000000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "1000000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/DaoResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/proposal-explainer",
                    "description": "DAO proposal explainer by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "1000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/proposal-simulation/check": {
      "post": {
        "operationId": "proposalSimulationCheck",
        "tags": [
          "jobs"
        ],
        "summary": "DAO proposal explainer with fork simulation: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "The same input as the proposal explainer, on Ethereum only (the simulation forks Ethereum mainnet).",
                "oneOf": [
                  {
                    "title": "governor-proposal",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "governor",
                      "proposalId"
                    ],
                    "properties": {
                      "kind": {
                        "const": "governor-proposal"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "governor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "proposalId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "flavor": {
                        "enum": [
                          "oz",
                          "bravo",
                          "tornado",
                          "auto"
                        ],
                        "description": "optional; detected by the free check"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "timelock-operation",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "timelock"
                    ],
                    "description": "exactly one of queueTxHash (Compound Timelock), operationId or scheduleTxHash (TimelockController)",
                    "properties": {
                      "kind": {
                        "const": "timelock-operation"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "timelock": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "queueTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "operationId": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "scheduleTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "safe-tx",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "safe"
                    ],
                    "description": "either the transaction fields (to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, nonce), executedTxHash, or safeTxHash",
                    "properties": {
                      "kind": {
                        "const": "safe-tx"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "safe": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "to": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "value": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "data": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "operation": {
                        "enum": [
                          0,
                          1,
                          "0",
                          "1",
                          "call",
                          "delegatecall"
                        ]
                      },
                      "safeTxGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "baseGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasPrice": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasToken": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "refundReceiver": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "nonce": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "executedTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "safeTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "raw-actions",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "executor"
                    ],
                    "description": "targets and calldatas of the same length (at most 50 actions, and at most about 80 KB of calldata in total: the request body is limited to 160 KB and hex takes two characters per byte), or flavor diamond-cut with diamondCut (which may be empty when init is given). The simulation runs every action as a call, so operations must all be call",
                    "properties": {
                      "kind": {
                        "const": "raw-actions"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "executor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "targets": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x[0-9a-fA-F]{40}$"
                        },
                        "maxItems": 50
                      },
                      "values": {
                        "type": "array",
                        "items": {
                          "type": [
                            "string",
                            "integer"
                          ],
                          "pattern": "^[0-9]{1,78}$"
                        }
                      },
                      "calldatas": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x([0-9a-fA-F]{2})*$"
                        },
                        "maxItems": 50
                      },
                      "signatures": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "operations": {
                        "type": "array",
                        "items": {
                          "enum": [
                            0,
                            "0",
                            "call"
                          ]
                        },
                        "description": "call only: the fork simulation cannot run DELEGATECALL actions (the proposal explainer decodes them)"
                      },
                      "description": {
                        "type": "string",
                        "maxLength": 40000
                      },
                      "context": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "governor": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "proposalId": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,78}$"
                          },
                          "storedTxHash": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{64}$"
                          },
                          "proposer": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "createdBlock": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,12}$",
                            "description": "optional block where the proposal was created: the reference block for age checks (for example whether a target contract is newer than the proposal); default: the review block"
                          }
                        }
                      },
                      "flavor": {
                        "const": "diamond-cut"
                      },
                      "diamondCut": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "facet",
                            "action",
                            "selectors"
                          ],
                          "properties": {
                            "facet": {
                              "type": "string",
                              "pattern": "^0x[0-9a-fA-F]{40}$"
                            },
                            "action": {
                              "enum": [
                                0,
                                1,
                                2
                              ]
                            },
                            "selectors": {
                              "type": "array",
                              "items": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{8}$"
                              }
                            }
                          }
                        },
                        "description": "the facet cuts; may be an empty list when init and initCalldata are given (an init-only upgrade)"
                      },
                      "init": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "initCalldata": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "transaction",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "txHash"
                    ],
                    "description": "a transaction whose input is a wrapper the engine decodes (queue, schedule, propose or execTransaction)",
                    "properties": {
                      "kind": {
                        "const": "transaction"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "txHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the block before the transaction"
                      }
                    }
                  }
                ]
              },
              "example": {
                "kind": "governor-proposal",
                "chain": "ethereum",
                "governor": "0x323A76393544d5ecca80cd6ef2A560C6a395b7E3",
                "proposalId": "107313977323541760723614084561841045035159333942448750767795024713131429640046"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "proposal-simulation",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "2.50",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "2500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/proposal-simulation": {
      "post": {
        "operationId": "proposalSimulation",
        "tags": [
          "jobs"
        ],
        "summary": "DAO proposal explainer with fork simulation: $2.50 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 2500000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 200 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 3 per paying wallet a day, 20 for all wallets a day, 1 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "The same input as the proposal explainer, on Ethereum only (the simulation forks Ethereum mainnet).",
                "oneOf": [
                  {
                    "title": "governor-proposal",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "governor",
                      "proposalId"
                    ],
                    "properties": {
                      "kind": {
                        "const": "governor-proposal"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "governor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "proposalId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "flavor": {
                        "enum": [
                          "oz",
                          "bravo",
                          "tornado",
                          "auto"
                        ],
                        "description": "optional; detected by the free check"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "timelock-operation",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "timelock"
                    ],
                    "description": "exactly one of queueTxHash (Compound Timelock), operationId or scheduleTxHash (TimelockController)",
                    "properties": {
                      "kind": {
                        "const": "timelock-operation"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "timelock": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "queueTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "operationId": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "scheduleTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "safe-tx",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "safe"
                    ],
                    "description": "either the transaction fields (to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, nonce), executedTxHash, or safeTxHash",
                    "properties": {
                      "kind": {
                        "const": "safe-tx"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "safe": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "to": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "value": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "data": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "operation": {
                        "enum": [
                          0,
                          1,
                          "0",
                          "1",
                          "call",
                          "delegatecall"
                        ]
                      },
                      "safeTxGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "baseGas": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasPrice": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "gasToken": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "refundReceiver": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "nonce": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "executedTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "safeTxHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "raw-actions",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "executor"
                    ],
                    "description": "targets and calldatas of the same length (at most 50 actions, and at most about 80 KB of calldata in total: the request body is limited to 160 KB and hex takes two characters per byte), or flavor diamond-cut with diamondCut (which may be empty when init is given). The simulation runs every action as a call, so operations must all be call",
                    "properties": {
                      "kind": {
                        "const": "raw-actions"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "executor": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "targets": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x[0-9a-fA-F]{40}$"
                        },
                        "maxItems": 50
                      },
                      "values": {
                        "type": "array",
                        "items": {
                          "type": [
                            "string",
                            "integer"
                          ],
                          "pattern": "^[0-9]{1,78}$"
                        }
                      },
                      "calldatas": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "pattern": "^0x([0-9a-fA-F]{2})*$"
                        },
                        "maxItems": 50
                      },
                      "signatures": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "operations": {
                        "type": "array",
                        "items": {
                          "enum": [
                            0,
                            "0",
                            "call"
                          ]
                        },
                        "description": "call only: the fork simulation cannot run DELEGATECALL actions (the proposal explainer decodes them)"
                      },
                      "description": {
                        "type": "string",
                        "maxLength": 40000
                      },
                      "context": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "governor": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "proposalId": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,78}$"
                          },
                          "storedTxHash": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{64}$"
                          },
                          "proposer": {
                            "type": "string",
                            "pattern": "^0x[0-9a-fA-F]{40}$"
                          },
                          "createdBlock": {
                            "type": [
                              "string",
                              "integer"
                            ],
                            "pattern": "^[0-9]{1,12}$",
                            "description": "optional block where the proposal was created: the reference block for age checks (for example whether a target contract is newer than the proposal); default: the review block"
                          }
                        }
                      },
                      "flavor": {
                        "const": "diamond-cut"
                      },
                      "diamondCut": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "facet",
                            "action",
                            "selectors"
                          ],
                          "properties": {
                            "facet": {
                              "type": "string",
                              "pattern": "^0x[0-9a-fA-F]{40}$"
                            },
                            "action": {
                              "enum": [
                                0,
                                1,
                                2
                              ]
                            },
                            "selectors": {
                              "type": "array",
                              "items": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{8}$"
                              }
                            }
                          }
                        },
                        "description": "the facet cuts; may be an empty list when init and initCalldata are given (an init-only upgrade)"
                      },
                      "init": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "initCalldata": {
                        "type": "string",
                        "pattern": "^0x([0-9a-fA-F]{2})*$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                      }
                    }
                  },
                  {
                    "title": "transaction",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "chain",
                      "txHash"
                    ],
                    "description": "a transaction whose input is a wrapper the engine decodes (queue, schedule, propose or execTransaction)",
                    "properties": {
                      "kind": {
                        "const": "transaction"
                      },
                      "chain": {
                        "const": "ethereum"
                      },
                      "txHash": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{64}$"
                      },
                      "reviewAtBlock": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$",
                        "description": "optional block number to read at; default: the block before the transaction"
                      }
                    }
                  }
                ]
              },
              "example": {
                "kind": "governor-proposal",
                "chain": "ethereum",
                "governor": "0x323A76393544d5ecca80cd6ef2A560C6a395b7E3",
                "proposalId": "107313977323541760723614084561841045035159333942448750767795024713131429640046"
              }
            }
          }
        },
        "x-kokomoji-price": "2.50",
        "x-kokomoji-amount": "2500000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "2500000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/DaoResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/proposal-simulation",
                    "description": "DAO proposal explainer with fork simulation by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "2500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/dao-health-check/check": {
      "post": {
        "operationId": "daoHealthCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "DAO health check: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "Send either dao (a curated alias) or governor (an address on Ethereum). OpenZeppelin Governor and GovernorBravo only in v1.",
                "oneOf": [
                  {
                    "required": [
                      "dao"
                    ]
                  },
                  {
                    "required": [
                      "governor"
                    ]
                  }
                ],
                "properties": {
                  "dao": {
                    "enum": [
                      "compound",
                      "ens",
                      "gitcoin",
                      "uniswap"
                    ]
                  },
                  "governor": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "token": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "chain": {
                    "const": "ethereum"
                  },
                  "reviewAtBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                  }
                }
              },
              "example": {
                "dao": "ens"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "dao-health-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "2.00",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "2000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/dao-health-check": {
      "post": {
        "operationId": "daoHealthCheck",
        "tags": [
          "jobs"
        ],
        "summary": "DAO health check: $2.00 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 2000000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 200 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 3 per paying wallet a day, 20 for all wallets a day, 1 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "Send either dao (a curated alias) or governor (an address on Ethereum). OpenZeppelin Governor and GovernorBravo only in v1.",
                "oneOf": [
                  {
                    "required": [
                      "dao"
                    ]
                  },
                  {
                    "required": [
                      "governor"
                    ]
                  }
                ],
                "properties": {
                  "dao": {
                    "enum": [
                      "compound",
                      "ens",
                      "gitcoin",
                      "uniswap"
                    ]
                  },
                  "governor": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "token": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "chain": {
                    "const": "ethereum"
                  },
                  "reviewAtBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block number to read at; default: the latest block minus 2, pinned by the free check"
                  }
                }
              },
              "example": {
                "dao": "ens"
              }
            }
          }
        },
        "x-kokomoji-price": "2.00",
        "x-kokomoji-amount": "2000000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "2000000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/DaoResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/dao-health-check",
                    "description": "DAO health check by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "2000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/art-critique/check": {
      "post": {
        "operationId": "artCritiqueCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Art critique: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503); and this job's own check: unsupported_chain (400), denied, no_contract, not_found, no_uri, no_meta, no_image, video_only, bad_format, too_large, blocked_host (422), limit_collection (429), not_configured, budget, low_float, limit_day, gateway_down, rpc_down, internal (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract",
                  "tokenId"
                ],
                "description": "An NFT reference only: no image URLs, no free text.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "minimum": 0
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b",
                "tokenId": "188"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "art-critique",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.10",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request, unsupported_chain.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive, denied, no_contract, not_found, no_uri, no_meta, no_image, video_only, bad_format, too_large, blocked_host.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited, limit_collection.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, not_configured, budget, low_float, limit_day, gateway_down, rpc_down, internal.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/art-critique": {
      "post": {
        "operationId": "artCritique",
        "tags": [
          "jobs"
        ],
        "summary": "Art critique: $0.10 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 100000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 100 for all wallets a day, 2 at once. Closed (503 not_calibrated, before any payment) until its one-time calibration has run.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract",
                  "tokenId"
                ],
                "description": "An NFT reference only: no image URLs, no free text.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "minimum": 0
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b",
                "tokenId": "188"
              }
            }
          }
        },
        "x-kokomoji-price": "0.10",
        "x-kokomoji-amount": "100000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "100000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/CritiqueResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key, unsupported_chain.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/art-critique",
                    "description": "Art critique by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused, denied, no_contract, not_found, no_uri, no_meta, no_image, video_only, bad_format, too_large, blocked_host.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited, limit_collection.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable, not_configured, budget, low_float, limit_day, gateway_down, rpc_down, internal.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/chain-answer/check": {
      "post": {
        "operationId": "chainAnswerCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Chain answer, recounted by Kokomojis: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "One recipe per job. Unknown fields are refused. block is optional: the free check pins the latest block minus the chain's pin lag (2 blocks on Ethereum, about 2 minutes on the L2s). Questions in plain words go to chain-answer-question.",
                "oneOf": [
                  {
                    "title": "recipe",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chain",
                      "recipe"
                    ],
                    "properties": {
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "block": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$"
                      },
                      "recipe": {
                        "oneOf": [
                          {
                            "title": "point",
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                              "kind",
                              "reads"
                            ],
                            "description": "1 to 20 typed reads, at most 40 chain reads in all (token reads add one decimals read per token, proxySlots reads 3 slots), view reads on at most 5 contracts",
                            "properties": {
                              "kind": {
                                "const": "point"
                              },
                              "reads": {
                                "type": "array",
                                "minItems": 1,
                                "maxItems": 20,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "op"
                                  ],
                                  "description": "op and its fields: nativeBalance {address}; tokenBalance {token, holder}; tokenSupply {token}; tokenAllowance {token, owner, spender}; ownerOf {collection, tokenId}; view {address, signature, args} (a view or pure function in the ABI of the contract's verified source on Sourcify; price, rate and oracle functions are refused); storage {address, slot}; codehash {address}; proxySlots {address} (EIP-1967); receipt {txHash} (mined at or before the block)",
                                  "properties": {
                                    "op": {
                                      "enum": [
                                        "nativeBalance",
                                        "tokenBalance",
                                        "tokenSupply",
                                        "tokenAllowance",
                                        "ownerOf",
                                        "view",
                                        "storage",
                                        "codehash",
                                        "proxySlots",
                                        "receipt"
                                      ]
                                    },
                                    "address": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "token": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "holder": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "owner": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "spender": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "collection": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "tokenId": {
                                      "type": [
                                        "string",
                                        "integer"
                                      ],
                                      "pattern": "^[0-9]{1,78}$"
                                    },
                                    "signature": {
                                      "type": "string",
                                      "maxLength": 200
                                    },
                                    "args": {
                                      "type": "array",
                                      "maxItems": 4
                                    },
                                    "slot": {
                                      "type": [
                                        "string",
                                        "integer"
                                      ]
                                    },
                                    "txHash": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{64}$"
                                    }
                                  }
                                }
                              }
                            }
                          },
                          {
                            "title": "window",
                            "type": "object",
                            "description": "one count, sum or distinct count over the logs of 1 to 5 contracts: preset transfers {token, from?, to?, aggregate: count | sum | distinctFrom | distinctTo}, or address, topics and aggregate {type: count} | {type: sum, value: {from: data, word} | {from: topic, index}} | {type: distinct, field: {from: emitter | tx | topicAddress, index}}. fromBlock and toBlock, or lastBlocks. Windows end at the pinned block and at least 64 blocks behind the head; up to 100,000 blocks on Ethereum, Arbitrum and OP Mainnet, 20,000 on Base, and 20,000 logs (more logs fail with nothing charged)",
                            "required": [
                              "kind"
                            ],
                            "properties": {
                              "kind": {
                                "const": "window"
                              },
                              "preset": {
                                "const": "transfers"
                              },
                              "token": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{40}$"
                              },
                              "from": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{40}$"
                              },
                              "to": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{40}$"
                              },
                              "address": {
                                "type": [
                                  "string",
                                  "array"
                                ]
                              },
                              "topics": {
                                "type": "array",
                                "maxItems": 4
                              },
                              "aggregate": {
                                "type": [
                                  "string",
                                  "object"
                                ]
                              },
                              "fromBlock": {
                                "type": [
                                  "string",
                                  "integer"
                                ],
                                "pattern": "^[0-9]{1,12}$"
                              },
                              "toBlock": {
                                "type": [
                                  "string",
                                  "integer"
                                ],
                                "pattern": "^[0-9]{1,12}$"
                              },
                              "lastBlocks": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 100000
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                ]
              },
              "example": {
                "chain": "ethereum",
                "recipe": {
                  "kind": "point",
                  "reads": [
                    {
                      "op": "ownerOf",
                      "collection": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                      "tokenId": "188"
                    },
                    {
                      "op": "tokenSupply",
                      "token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "chain-answer",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/chain-answer": {
      "post": {
        "operationId": "chainAnswer",
        "tags": [
          "jobs"
        ],
        "summary": "Chain answer, recounted by Kokomojis: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 30 per paying wallet a day, 300 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "One recipe per job. Unknown fields are refused. block is optional: the free check pins the latest block minus the chain's pin lag (2 blocks on Ethereum, about 2 minutes on the L2s). Questions in plain words go to chain-answer-question.",
                "oneOf": [
                  {
                    "title": "recipe",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chain",
                      "recipe"
                    ],
                    "properties": {
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "block": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$"
                      },
                      "recipe": {
                        "oneOf": [
                          {
                            "title": "point",
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                              "kind",
                              "reads"
                            ],
                            "description": "1 to 20 typed reads, at most 40 chain reads in all (token reads add one decimals read per token, proxySlots reads 3 slots), view reads on at most 5 contracts",
                            "properties": {
                              "kind": {
                                "const": "point"
                              },
                              "reads": {
                                "type": "array",
                                "minItems": 1,
                                "maxItems": 20,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "op"
                                  ],
                                  "description": "op and its fields: nativeBalance {address}; tokenBalance {token, holder}; tokenSupply {token}; tokenAllowance {token, owner, spender}; ownerOf {collection, tokenId}; view {address, signature, args} (a view or pure function in the ABI of the contract's verified source on Sourcify; price, rate and oracle functions are refused); storage {address, slot}; codehash {address}; proxySlots {address} (EIP-1967); receipt {txHash} (mined at or before the block)",
                                  "properties": {
                                    "op": {
                                      "enum": [
                                        "nativeBalance",
                                        "tokenBalance",
                                        "tokenSupply",
                                        "tokenAllowance",
                                        "ownerOf",
                                        "view",
                                        "storage",
                                        "codehash",
                                        "proxySlots",
                                        "receipt"
                                      ]
                                    },
                                    "address": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "token": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "holder": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "owner": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "spender": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "collection": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{40}$"
                                    },
                                    "tokenId": {
                                      "type": [
                                        "string",
                                        "integer"
                                      ],
                                      "pattern": "^[0-9]{1,78}$"
                                    },
                                    "signature": {
                                      "type": "string",
                                      "maxLength": 200
                                    },
                                    "args": {
                                      "type": "array",
                                      "maxItems": 4
                                    },
                                    "slot": {
                                      "type": [
                                        "string",
                                        "integer"
                                      ]
                                    },
                                    "txHash": {
                                      "type": "string",
                                      "pattern": "^0x[0-9a-fA-F]{64}$"
                                    }
                                  }
                                }
                              }
                            }
                          },
                          {
                            "title": "window",
                            "type": "object",
                            "description": "one count, sum or distinct count over the logs of 1 to 5 contracts: preset transfers {token, from?, to?, aggregate: count | sum | distinctFrom | distinctTo}, or address, topics and aggregate {type: count} | {type: sum, value: {from: data, word} | {from: topic, index}} | {type: distinct, field: {from: emitter | tx | topicAddress, index}}. fromBlock and toBlock, or lastBlocks. Windows end at the pinned block and at least 64 blocks behind the head; up to 100,000 blocks on Ethereum, Arbitrum and OP Mainnet, 20,000 on Base, and 20,000 logs (more logs fail with nothing charged)",
                            "required": [
                              "kind"
                            ],
                            "properties": {
                              "kind": {
                                "const": "window"
                              },
                              "preset": {
                                "const": "transfers"
                              },
                              "token": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{40}$"
                              },
                              "from": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{40}$"
                              },
                              "to": {
                                "type": "string",
                                "pattern": "^0x[0-9a-fA-F]{40}$"
                              },
                              "address": {
                                "type": [
                                  "string",
                                  "array"
                                ]
                              },
                              "topics": {
                                "type": "array",
                                "maxItems": 4
                              },
                              "aggregate": {
                                "type": [
                                  "string",
                                  "object"
                                ]
                              },
                              "fromBlock": {
                                "type": [
                                  "string",
                                  "integer"
                                ],
                                "pattern": "^[0-9]{1,12}$"
                              },
                              "toBlock": {
                                "type": [
                                  "string",
                                  "integer"
                                ],
                                "pattern": "^[0-9]{1,12}$"
                              },
                              "lastBlocks": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 100000
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                ]
              },
              "example": {
                "chain": "ethereum",
                "recipe": {
                  "kind": "point",
                  "reads": [
                    {
                      "op": "ownerOf",
                      "collection": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                      "tokenId": "188"
                    },
                    {
                      "op": "tokenSupply",
                      "token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
                    }
                  ]
                }
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/chain-answer",
                    "description": "Chain answer, recounted by Kokomojis by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/chain-answer-question/check": {
      "post": {
        "operationId": "chainAnswerQuestionCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Chain answer from a question: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "One question per job (8 to 500 characters). block is optional and pinned by the free check.",
                "oneOf": [
                  {
                    "title": "question",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chain",
                      "question"
                    ],
                    "properties": {
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "block": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$"
                      },
                      "question": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 500
                      }
                    }
                  }
                ]
              },
              "example": {
                "chain": "ethereum",
                "question": "How many tokens does totalSupply() report for the Kokomoji contract 0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b?"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "chain-answer-question",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/chain-answer-question": {
      "post": {
        "operationId": "chainAnswerQuestion",
        "tags": [
          "jobs"
        ],
        "summary": "Chain answer from a question: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 150 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "One question per job (8 to 500 characters). block is optional and pinned by the free check.",
                "oneOf": [
                  {
                    "title": "question",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chain",
                      "question"
                    ],
                    "properties": {
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base",
                          "arbitrum",
                          "optimism"
                        ]
                      },
                      "block": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,12}$"
                      },
                      "question": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 500
                      }
                    }
                  }
                ]
              },
              "example": {
                "chain": "ethereum",
                "question": "How many tokens does totalSupply() report for the Kokomoji contract 0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b?"
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/chain-answer-question",
                    "description": "Chain answer from a question by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/transfer-rules-check/check": {
      "post": {
        "operationId": "transferRulesCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Royalty and transfer rules check: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract"
                ],
                "description": "One ERC-721 collection per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "tokenIds": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 5,
                    "items": {
                      "type": [
                        "string",
                        "integer"
                      ],
                      "pattern": "^[0-9]{1,78}$"
                    },
                    "description": "optional royalty samples; default token 1"
                  },
                  "salePriceWei": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "optional sale price for the royalty amount"
                  },
                  "wallet": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "optional: one wallet simulated as the sender"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block on the collection's chain; default: the head minus the pin lag, pinned by the free check"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b",
                "tokenIds": [
                  "188"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "transfer-rules-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.30",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "300000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/transfer-rules-check": {
      "post": {
        "operationId": "transferRulesCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Royalty and transfer rules check: $0.30 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 300000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 200 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract"
                ],
                "description": "One ERC-721 collection per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "tokenIds": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 5,
                    "items": {
                      "type": [
                        "string",
                        "integer"
                      ],
                      "pattern": "^[0-9]{1,78}$"
                    },
                    "description": "optional royalty samples; default token 1"
                  },
                  "salePriceWei": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "optional sale price for the royalty amount"
                  },
                  "wallet": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "optional: one wallet simulated as the sender"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block on the collection's chain; default: the head minus the pin lag, pinned by the free check"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b",
                "tokenIds": [
                  "188"
                ]
              }
            }
          }
        },
        "x-kokomoji-price": "0.30",
        "x-kokomoji-amount": "300000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "300000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/transfer-rules-check",
                    "description": "Royalty and transfer rules check by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "300000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/send-check/check": {
      "post": {
        "operationId": "sendCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Before-you-send address check: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "to"
                ],
                "description": "One address per job, public mode. Unknown fields are refused.",
                "properties": {
                  "to": {
                    "type": "string",
                    "description": "one 0x address (40 hex characters; a mixed-case address must have a valid EIP-55 checksum) or one .eth name with labels of a-z, 0-9 and hyphen, resolved on-chain on Ethereum"
                  },
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base",
                      "arbitrum",
                      "optimism"
                    ],
                    "description": "optional: the chain the payment would go out on; the report covers all four chains and names this one"
                  }
                }
              },
              "example": {
                "to": "0x9d02ea2f7ba3554d8e71c0f3eb0671df3f268224",
                "chain": "base"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "send-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.20",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "200000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/send-check": {
      "post": {
        "operationId": "sendCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Before-you-send address check: $0.20 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 200000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 100 per paying wallet a day, 2000 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "to"
                ],
                "description": "One address per job, public mode. Unknown fields are refused.",
                "properties": {
                  "to": {
                    "type": "string",
                    "description": "one 0x address (40 hex characters; a mixed-case address must have a valid EIP-55 checksum) or one .eth name with labels of a-z, 0-9 and hyphen, resolved on-chain on Ethereum"
                  },
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base",
                      "arbitrum",
                      "optimism"
                    ],
                    "description": "optional: the chain the payment would go out on; the report covers all four chains and names this one"
                  }
                }
              },
              "example": {
                "to": "0x9d02ea2f7ba3554d8e71c0f3eb0671df3f268224",
                "chain": "base"
              }
            }
          }
        },
        "x-kokomoji-price": "0.20",
        "x-kokomoji-amount": "200000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "200000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/send-check",
                    "description": "Before-you-send address check by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "200000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/token-facts/check": {
      "post": {
        "operationId": "tokenFactsCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Token fact sheet: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "token"
                ],
                "description": "One token per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "token": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block to read at; default: the head minus the chain's pin lag, pinned by the free check"
                  },
                  "holders": {
                    "type": "boolean",
                    "description": "optional; true adds holder concentration from Transfer logs (up to 100,000 Transfer events; Ethereum: tokens deployed within 2,000,000 blocks, about 278 days, of the block read; Base: within 20,000 blocks, about 11 hours)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "token": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
                "holders": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "token-facts",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/token-facts": {
      "post": {
        "operationId": "tokenFacts",
        "tags": [
          "jobs"
        ],
        "summary": "Token fact sheet: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 180 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 30 per paying wallet a day, 300 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "token"
                ],
                "description": "One token per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "token": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block to read at; default: the head minus the chain's pin lag, pinned by the free check"
                  },
                  "holders": {
                    "type": "boolean",
                    "description": "optional; true adds holder concentration from Transfer logs (up to 100,000 Transfer events; Ethereum: tokens deployed within 2,000,000 blocks, about 278 days, of the block read; Base: within 20,000 blocks, about 11 hours)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "token": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
                "holders": false
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/token-facts",
                    "description": "Token fact sheet by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/governance-watch/check": {
      "post": {
        "operationId": "governanceWatchCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Governance digest: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "governor",
                  "fromBlock"
                ],
                "description": "One governor and one block window per job. The window is at most 200,000 blocks (about 28 days) and ends at most 64 blocks before the chain head; without toBlock it ends there. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "const": "ethereum"
                  },
                  "governor": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an OpenZeppelin Governor, a GovernorBravo or a Nouns-style Bravo fork"
                  },
                  "fromBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "first block of the window (at least 1)"
                  },
                  "toBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional last block of the window; default and maximum: the chain head minus 64, pinned by the free check"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "governor": "0x408ED6354d4973f66138C91495F2f2FCbd8724C3",
                "fromBlock": "26100000",
                "toBlock": "26150000"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "governance-watch",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.50",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/governance-watch": {
      "post": {
        "operationId": "governanceWatch",
        "tags": [
          "jobs"
        ],
        "summary": "Governance digest: $0.50 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 500000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 200 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "governor",
                  "fromBlock"
                ],
                "description": "One governor and one block window per job. The window is at most 200,000 blocks (about 28 days) and ends at most 64 blocks before the chain head; without toBlock it ends there. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "const": "ethereum"
                  },
                  "governor": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an OpenZeppelin Governor, a GovernorBravo or a Nouns-style Bravo fork"
                  },
                  "fromBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "first block of the window (at least 1)"
                  },
                  "toBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional last block of the window; default and maximum: the chain head minus 64, pinned by the free check"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "governor": "0x408ED6354d4973f66138C91495F2f2FCbd8724C3",
                "fromBlock": "26100000",
                "toBlock": "26150000"
              }
            }
          }
        },
        "x-kokomoji-price": "0.50",
        "x-kokomoji-amount": "500000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "500000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/governance-watch",
                    "description": "Governance digest by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/approval-check/check": {
      "post": {
        "operationId": "approvalCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Open approvals check: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "One owner per job: {chain, owner} or {kokomoji}. Unknown fields are refused; the pinned block is set by the service.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum"
                    ],
                    "description": "the chain to read; required with owner; with kokomoji it may only be ethereum"
                  },
                  "owner": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one 0x address (a wallet, a Safe or any contract); a mixed-case address must have a valid EIP-55 checksum"
                  },
                  "kokomoji": {
                    "type": [
                      "integer",
                      "string"
                    ],
                    "description": "a Kokomoji token id (1 to 2372): its ERC-6551 token account on Ethereum, resolved with tokenAccount(n) at the pinned block on two endpoint families that must agree"
                  }
                }
              },
              "example": {
                "kokomoji": 188
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "approval-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/approval-check": {
      "post": {
        "operationId": "approvalCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Open approvals check: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 30 per paying wallet a day, 1000 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "One owner per job: {chain, owner} or {kokomoji}. Unknown fields are refused; the pinned block is set by the service.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum"
                    ],
                    "description": "the chain to read; required with owner; with kokomoji it may only be ethereum"
                  },
                  "owner": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one 0x address (a wallet, a Safe or any contract); a mixed-case address must have a valid EIP-55 checksum"
                  },
                  "kokomoji": {
                    "type": [
                      "integer",
                      "string"
                    ],
                    "description": "a Kokomoji token id (1 to 2372): its ERC-6551 token account on Ethereum, resolved with tokenAccount(n) at the pinned block on two endpoint families that must agree"
                  }
                }
              },
              "example": {
                "kokomoji": 188
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/approval-check",
                    "description": "Open approvals check by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/delegation-check/check": {
      "post": {
        "operationId": "delegationCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "EIP-7702 delegation check: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain"
                ],
                "description": "Exactly one of {chain, delegate}, {chain, account} or {chain, account, authorization}. One item per job; never a signature or signed authorization bytes. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base",
                      "arbitrum",
                      "optimism"
                    ],
                    "description": "the chain the delegation is checked on; the delegate's code and the account's delegation are also read on the other three"
                  },
                  "delegate": {
                    "type": "string",
                    "description": "one 0x address: the code a delegation would point to (a mixed-case address needs a valid EIP-55 checksum)"
                  },
                  "account": {
                    "type": "string",
                    "description": "one 0x address: the account whose current delegation is read on all four chains"
                  },
                  "authorization": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chainId",
                      "address",
                      "nonce"
                    ],
                    "description": "the unsigned EIP-7702 authorization tuple, with account",
                    "properties": {
                      "chainId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "description": "0 (valid on every chain) or the id of the chain named in chain"
                      },
                      "address": {
                        "type": "string",
                        "description": "the delegate address the tuple sets (the zero address clears a delegation)"
                      },
                      "nonce": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "description": "the tuple's nonce, 0 to 2^64 - 1"
                      }
                    }
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "account": "0x13fa86ce645655eab92b14a4e0fbbff3bec56974"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "delegation-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/delegation-check": {
      "post": {
        "operationId": "delegationCheck",
        "tags": [
          "jobs"
        ],
        "summary": "EIP-7702 delegation check: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 30 per paying wallet a day, 1000 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain"
                ],
                "description": "Exactly one of {chain, delegate}, {chain, account} or {chain, account, authorization}. One item per job; never a signature or signed authorization bytes. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base",
                      "arbitrum",
                      "optimism"
                    ],
                    "description": "the chain the delegation is checked on; the delegate's code and the account's delegation are also read on the other three"
                  },
                  "delegate": {
                    "type": "string",
                    "description": "one 0x address: the code a delegation would point to (a mixed-case address needs a valid EIP-55 checksum)"
                  },
                  "account": {
                    "type": "string",
                    "description": "one 0x address: the account whose current delegation is read on all four chains"
                  },
                  "authorization": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chainId",
                      "address",
                      "nonce"
                    ],
                    "description": "the unsigned EIP-7702 authorization tuple, with account",
                    "properties": {
                      "chainId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "description": "0 (valid on every chain) or the id of the chain named in chain"
                      },
                      "address": {
                        "type": "string",
                        "description": "the delegate address the tuple sets (the zero address clears a delegation)"
                      },
                      "nonce": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "description": "the tuple's nonce, 0 to 2^64 - 1"
                      }
                    }
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "account": "0x13fa86ce645655eab92b14a4e0fbbff3bec56974"
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/delegation-check",
                    "description": "EIP-7702 delegation check by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/multisig-profile/check": {
      "post": {
        "operationId": "multisigProfileCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Multisig control profile: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "safe"
                ],
                "description": "One Safe per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum",
                      "base"
                    ]
                  },
                  "safe": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one Safe proxy address (v1.1.1 to v1.5.0, including the L2 and eip155 singletons)"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional past block to read at; default: the chain head minus the pin lag (2 blocks on Ethereum, about 2 minutes on the L2s)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "safe": "0xb2492145ea92947C0b8dF138a398fcB22782a575"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "multisig-profile",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.50",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/multisig-profile": {
      "post": {
        "operationId": "multisigProfile",
        "tags": [
          "jobs"
        ],
        "summary": "Multisig control profile: $0.50 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 500000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "safe"
                ],
                "description": "One Safe per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum",
                      "base"
                    ]
                  },
                  "safe": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one Safe proxy address (v1.1.1 to v1.5.0, including the L2 and eip155 singletons)"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional past block to read at; default: the chain head minus the pin lag (2 blocks on Ethereum, about 2 minutes on the L2s)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "safe": "0xb2492145ea92947C0b8dF138a398fcB22782a575"
              }
            }
          }
        },
        "x-kokomoji-price": "0.50",
        "x-kokomoji-amount": "500000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "500000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/multisig-profile",
                    "description": "Multisig control profile by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/agent-card-check/check": {
      "post": {
        "operationId": "agentCardCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "ERC-8004 agent dossier: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "agentId"
                ],
                "description": "One agent per job. Unknown fields are refused; there is no URL or free-text input.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ],
                    "description": "the chain of the ERC-8004 IdentityRegistry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
                  },
                  "agentId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "description": "the agent id, a whole number (a decimal string for ids above 2^53)"
                  },
                  "expectedWallet": {
                    "type": "string",
                    "description": "optional: a 0x address compared with the agentWallet at the pinned block"
                  },
                  "expectedEndpoint": {
                    "type": "string",
                    "maxLength": 512,
                    "description": "optional: one string compared exactly with the endpoints in the card; never fetched or contacted"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "agentId": "54304"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "agent-card-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/agent-card-check": {
      "post": {
        "operationId": "agentCardCheck",
        "tags": [
          "jobs"
        ],
        "summary": "ERC-8004 agent dossier: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 50 per paying wallet a day, 1000 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "agentId"
                ],
                "description": "One agent per job. Unknown fields are refused; there is no URL or free-text input.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ],
                    "description": "the chain of the ERC-8004 IdentityRegistry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
                  },
                  "agentId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "description": "the agent id, a whole number (a decimal string for ids above 2^53)"
                  },
                  "expectedWallet": {
                    "type": "string",
                    "description": "optional: a 0x address compared with the agentWallet at the pinned block"
                  },
                  "expectedEndpoint": {
                    "type": "string",
                    "maxLength": 512,
                    "description": "optional: one string compared exactly with the endpoints in the card; never fetched or contacted"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "agentId": "54304"
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/agent-card-check",
                    "description": "ERC-8004 agent dossier by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/x402-payee-check/check": {
      "post": {
        "operationId": "x402PayeeCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Check an x402 payment request before paying: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "Either one x402 payment requirement (paymentRequirements, optional agentId, agentChain and authorization) or one past payment (chain, txHash, expect). Unknown fields at any level are refused; no field may hold a URL.",
                "properties": {
                  "paymentRequirements": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "One entry of the seller's x402 accepts list, scheme exact: x402 v2 (amount, network eip155:8453 or eip155:1) or v1 (maxAmountRequired, network base or ethereum; mimeType accepted and ignored). resource, description and outputSchema are refused.",
                    "properties": {
                      "scheme": {
                        "const": "exact"
                      },
                      "network": {
                        "enum": [
                          "eip155:8453",
                          "eip155:1",
                          "base",
                          "ethereum"
                        ]
                      },
                      "amount": {
                        "type": "string",
                        "description": "v2: the amount in the asset's smallest unit, a whole number"
                      },
                      "maxAmountRequired": {
                        "type": "string",
                        "description": "v1: the amount in the asset's smallest unit, a whole number"
                      },
                      "asset": {
                        "type": "string",
                        "description": "the token contract (0x address)"
                      },
                      "payTo": {
                        "type": "string",
                        "description": "the address the payment goes to (0x address)"
                      },
                      "maxTimeoutSeconds": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 86400
                      },
                      "extra": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "name": {
                            "type": "string",
                            "maxLength": 64
                          },
                          "version": {
                            "type": "string",
                            "maxLength": 64
                          },
                          "assetTransferMethod": {
                            "const": "eip3009"
                          }
                        }
                      },
                      "mimeType": {
                        "type": "string",
                        "maxLength": 64
                      }
                    }
                  },
                  "x402Version": {
                    "enum": [
                      1,
                      2
                    ],
                    "description": "optional; must agree with the entry's fields"
                  },
                  "agentId": {
                    "type": "string",
                    "description": "optional ERC-8004 agent id; its getAgentWallet() is compared with payTo"
                  },
                  "agentChain": {
                    "enum": [
                      "base",
                      "ethereum"
                    ],
                    "description": "optional: the chain of the ERC-8004 identity registry (default: the payment chain)"
                  },
                  "authorization": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "optional unsigned EIP-3009 fields the payer is about to sign; a signature is refused",
                    "properties": {
                      "from": {
                        "type": "string"
                      },
                      "to": {
                        "type": "string"
                      },
                      "value": {
                        "type": "string"
                      },
                      "validAfter": {
                        "type": "string"
                      },
                      "validBefore": {
                        "type": "string"
                      },
                      "nonce": {
                        "type": "string"
                      }
                    }
                  },
                  "chain": {
                    "enum": [
                      "base",
                      "ethereum",
                      "eip155:8453",
                      "eip155:1"
                    ],
                    "description": "receipt mode: the chain of the transaction"
                  },
                  "txHash": {
                    "type": "string",
                    "description": "receipt mode: one transaction hash"
                  },
                  "expect": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "token",
                      "to",
                      "minAmount"
                    ],
                    "description": "receipt mode: what the payer expected the transaction to do",
                    "properties": {
                      "token": {
                        "type": "string"
                      },
                      "to": {
                        "type": "string"
                      },
                      "minAmount": {
                        "type": "string"
                      },
                      "from": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "example": {
                "paymentRequirements": {
                  "scheme": "exact",
                  "network": "eip155:8453",
                  "amount": "20000",
                  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                  "payTo": "0x7284d41b5b852f2bd4c99bdf95043d84452d299c",
                  "maxTimeoutSeconds": 60,
                  "extra": {
                    "name": "USD Coin",
                    "version": "2"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "x402-payee-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.20",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "200000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/x402-payee-check": {
      "post": {
        "operationId": "x402PayeeCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Check an x402 payment request before paying: $0.20 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 200000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 100 per paying wallet a day, 2000 for all wallets a day, 4 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "Either one x402 payment requirement (paymentRequirements, optional agentId, agentChain and authorization) or one past payment (chain, txHash, expect). Unknown fields at any level are refused; no field may hold a URL.",
                "properties": {
                  "paymentRequirements": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "One entry of the seller's x402 accepts list, scheme exact: x402 v2 (amount, network eip155:8453 or eip155:1) or v1 (maxAmountRequired, network base or ethereum; mimeType accepted and ignored). resource, description and outputSchema are refused.",
                    "properties": {
                      "scheme": {
                        "const": "exact"
                      },
                      "network": {
                        "enum": [
                          "eip155:8453",
                          "eip155:1",
                          "base",
                          "ethereum"
                        ]
                      },
                      "amount": {
                        "type": "string",
                        "description": "v2: the amount in the asset's smallest unit, a whole number"
                      },
                      "maxAmountRequired": {
                        "type": "string",
                        "description": "v1: the amount in the asset's smallest unit, a whole number"
                      },
                      "asset": {
                        "type": "string",
                        "description": "the token contract (0x address)"
                      },
                      "payTo": {
                        "type": "string",
                        "description": "the address the payment goes to (0x address)"
                      },
                      "maxTimeoutSeconds": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 86400
                      },
                      "extra": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "name": {
                            "type": "string",
                            "maxLength": 64
                          },
                          "version": {
                            "type": "string",
                            "maxLength": 64
                          },
                          "assetTransferMethod": {
                            "const": "eip3009"
                          }
                        }
                      },
                      "mimeType": {
                        "type": "string",
                        "maxLength": 64
                      }
                    }
                  },
                  "x402Version": {
                    "enum": [
                      1,
                      2
                    ],
                    "description": "optional; must agree with the entry's fields"
                  },
                  "agentId": {
                    "type": "string",
                    "description": "optional ERC-8004 agent id; its getAgentWallet() is compared with payTo"
                  },
                  "agentChain": {
                    "enum": [
                      "base",
                      "ethereum"
                    ],
                    "description": "optional: the chain of the ERC-8004 identity registry (default: the payment chain)"
                  },
                  "authorization": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "optional unsigned EIP-3009 fields the payer is about to sign; a signature is refused",
                    "properties": {
                      "from": {
                        "type": "string"
                      },
                      "to": {
                        "type": "string"
                      },
                      "value": {
                        "type": "string"
                      },
                      "validAfter": {
                        "type": "string"
                      },
                      "validBefore": {
                        "type": "string"
                      },
                      "nonce": {
                        "type": "string"
                      }
                    }
                  },
                  "chain": {
                    "enum": [
                      "base",
                      "ethereum",
                      "eip155:8453",
                      "eip155:1"
                    ],
                    "description": "receipt mode: the chain of the transaction"
                  },
                  "txHash": {
                    "type": "string",
                    "description": "receipt mode: one transaction hash"
                  },
                  "expect": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "token",
                      "to",
                      "minAmount"
                    ],
                    "description": "receipt mode: what the payer expected the transaction to do",
                    "properties": {
                      "token": {
                        "type": "string"
                      },
                      "to": {
                        "type": "string"
                      },
                      "minAmount": {
                        "type": "string"
                      },
                      "from": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "example": {
                "paymentRequirements": {
                  "scheme": "exact",
                  "network": "eip155:8453",
                  "amount": "20000",
                  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                  "payTo": "0x7284d41b5b852f2bd4c99bdf95043d84452d299c",
                  "maxTimeoutSeconds": 60,
                  "extra": {
                    "name": "USD Coin",
                    "version": "2"
                  }
                }
              }
            }
          }
        },
        "x-kokomoji-price": "0.20",
        "x-kokomoji-amount": "200000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "200000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/x402-payee-check",
                    "description": "Check an x402 payment request before paying by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "200000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/token-flow/check": {
      "post": {
        "operationId": "tokenFlowCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Token flow report: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "token",
                  "fromBlock"
                ],
                "description": "One ERC-20 token and one block window per job. The window is at most 200,000 blocks and ends at most 64 blocks before the chain head (480 on Arbitrum One); without toBlock it ends there. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "arbitrum",
                      "optimism"
                    ]
                  },
                  "token": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an ERC-20 token contract"
                  },
                  "fromBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "first block of the window (at least 1)"
                  },
                  "toBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional last block of the window; default and maximum: the head minus 64 (minus 480 on Arbitrum One), pinned by the free check"
                  },
                  "focus": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "optional: one address whose sent, received and net amounts are given (at most 3 different focus addresses per payer a day)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "token": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
                "fromBlock": "26230000",
                "toBlock": "26234999"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "token-flow",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.50",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/token-flow": {
      "post": {
        "operationId": "tokenFlow",
        "tags": [
          "jobs"
        ],
        "summary": "Token flow report: $0.50 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 500000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 180 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 200 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "token",
                  "fromBlock"
                ],
                "description": "One ERC-20 token and one block window per job. The window is at most 200,000 blocks and ends at most 64 blocks before the chain head (480 on Arbitrum One); without toBlock it ends there. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "arbitrum",
                      "optimism"
                    ]
                  },
                  "token": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an ERC-20 token contract"
                  },
                  "fromBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "first block of the window (at least 1)"
                  },
                  "toBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional last block of the window; default and maximum: the head minus 64 (minus 480 on Arbitrum One), pinned by the free check"
                  },
                  "focus": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "optional: one address whose sent, received and net amounts are given (at most 3 different focus addresses per payer a day)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "token": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
                "fromBlock": "26230000",
                "toBlock": "26234999"
              }
            }
          }
        },
        "x-kokomoji-price": "0.50",
        "x-kokomoji-amount": "500000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "500000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/token-flow",
                    "description": "Token flow report by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/permissions-map/check": {
      "post": {
        "operationId": "permissionsMapCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Contract permissions map: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "address"
                ],
                "description": "One contract per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum",
                      "base"
                    ]
                  },
                  "address": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one contract address with verified Solidity source on Sourcify or Blockscout (proxies are followed to their implementation); on Base, a contract younger than about 14 days"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional past block to read at; default: the chain head minus the pin lag (2 blocks on Ethereum, about 2 minutes on the L2s)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "address": "0xc18360217d8f7ab5e7c516566761ea12ce7f9d72"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "permissions-map",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.50",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/permissions-map": {
      "post": {
        "operationId": "permissionsMap",
        "tags": [
          "jobs"
        ],
        "summary": "Contract permissions map: $0.50 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 500000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "address"
                ],
                "description": "One contract per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum",
                      "base"
                    ]
                  },
                  "address": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one contract address with verified Solidity source on Sourcify or Blockscout (proxies are followed to their implementation); on Base, a contract younger than about 14 days"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional past block to read at; default: the chain head minus the pin lag (2 blocks on Ethereum, about 2 minutes on the L2s)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "address": "0xc18360217d8f7ab5e7c516566761ea12ce7f9d72"
              }
            }
          }
        },
        "x-kokomoji-price": "0.50",
        "x-kokomoji-amount": "500000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "500000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/permissions-map",
                    "description": "Contract permissions map by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/mint-contract-check/check": {
      "post": {
        "operationId": "mintContractCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "NFT contract powers and drop settings: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract"
                ],
                "description": "One NFT contract (ERC-721 or ERC-1155) per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "expect": {
                    "type": "object",
                    "additionalProperties": false,
                    "minProperties": 1,
                    "description": "optional: the settings you expect; each one is answered match, differ, not read or not applicable",
                    "properties": {
                      "maxSupply": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "mintPriceWei": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,25}$"
                      },
                      "payoutAddress": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "royaltyBps": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,5}$"
                      },
                      "royaltyReceiver": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "startTime": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,15}$"
                      },
                      "endTime": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,15}$"
                      },
                      "maxPerWallet": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,8}$"
                      }
                    }
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block on the contract's chain; default: the head minus the pin lag, pinned by the free check"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b",
                "expect": {
                  "payoutAddress": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                  "royaltyBps": "500"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "mint-contract-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "1.00",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "1000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/mint-contract-check": {
      "post": {
        "operationId": "mintContractCheck",
        "tags": [
          "jobs"
        ],
        "summary": "NFT contract powers and drop settings: $1.00 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 1000000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 200 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract"
                ],
                "description": "One NFT contract (ERC-721 or ERC-1155) per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$"
                  },
                  "expect": {
                    "type": "object",
                    "additionalProperties": false,
                    "minProperties": 1,
                    "description": "optional: the settings you expect; each one is answered match, differ, not read or not applicable",
                    "properties": {
                      "maxSupply": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$"
                      },
                      "mintPriceWei": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,25}$"
                      },
                      "payoutAddress": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "royaltyBps": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,5}$"
                      },
                      "royaltyReceiver": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "startTime": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,15}$"
                      },
                      "endTime": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,15}$"
                      },
                      "maxPerWallet": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,8}$"
                      }
                    }
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block on the contract's chain; default: the head minus the pin lag, pinned by the free check"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44Eeb5a7bCF210Ab9d2002C32c940D6f76DA8D9b",
                "expect": {
                  "payoutAddress": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                  "royaltyBps": "500"
                }
              }
            }
          }
        },
        "x-kokomoji-price": "1.00",
        "x-kokomoji-amount": "1000000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "1000000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/mint-contract-check",
                    "description": "NFT contract powers and drop settings by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "1000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/holder-snapshot/check": {
      "post": {
        "operationId": "holderSnapshotCheck",
        "tags": [
          "jobs"
        ],
        "summary": "NFT holder snapshot: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract"
                ],
                "description": "One ERC-721 or ERC-721A collection per job. Without a token id range, every token the collection has at the block is read (totalSupply() at most 3,000). block is at most the head minus 2 blocks on Ethereum (60 on Base); without it the free check pins that block. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "the collection contract (ERC-721 or ERC-721A)"
                  },
                  "block": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional snapshot block; default: the head minus the chain's pin lag, pinned by the free check"
                  },
                  "compareBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional earlier block: the same token ids are read there too and the differences are given as counts only"
                  },
                  "tokenIdFrom": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "optional first token id of a range (send tokenIdTo too; at most 3,000 ids)"
                  },
                  "tokenIdTo": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "optional last token id of the range"
                  },
                  "export": {
                    "enum": [
                      "csv",
                      "opensea-allowlist"
                    ],
                    "description": "csv (default): the owners CSV and JSON; opensea-allowlist: also an OpenSea Studio allowlist CSV (address,limit with the tokens held at the block)"
                  },
                  "minTokens": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3000,
                    "description": "allowlist only: leave out holders with fewer tokens (default 1)"
                  },
                  "excludeContracts": {
                    "type": [
                      "boolean",
                      "array"
                    ],
                    "items": {
                      "type": "string",
                      "pattern": "^0x[0-9a-fA-F]{40}$"
                    },
                    "maxItems": 100,
                    "description": "allowlist only: true leaves out owners with other contract code at the block (Safes, ERC-6551 accounts and EIP-7702 accounts are kept), or a list of up to 100 addresses to leave out"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeB5A7bcF210Ab9d2002c32C940d6F76DA8D9b",
                "export": "opensea-allowlist"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "holder-snapshot",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "2.00",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "2000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/holder-snapshot": {
      "post": {
        "operationId": "holderSnapshot",
        "tags": [
          "jobs"
        ],
        "summary": "NFT holder snapshot: $2.00 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 2000000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 240 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 10 per paying wallet a day, 80 for all wallets a day, 1 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract"
                ],
                "description": "One ERC-721 or ERC-721A collection per job. Without a token id range, every token the collection has at the block is read (totalSupply() at most 3,000). block is at most the head minus 2 blocks on Ethereum (60 on Base); without it the free check pins that block. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "the collection contract (ERC-721 or ERC-721A)"
                  },
                  "block": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional snapshot block; default: the head minus the chain's pin lag, pinned by the free check"
                  },
                  "compareBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional earlier block: the same token ids are read there too and the differences are given as counts only"
                  },
                  "tokenIdFrom": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "optional first token id of a range (send tokenIdTo too; at most 3,000 ids)"
                  },
                  "tokenIdTo": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "optional last token id of the range"
                  },
                  "export": {
                    "enum": [
                      "csv",
                      "opensea-allowlist"
                    ],
                    "description": "csv (default): the owners CSV and JSON; opensea-allowlist: also an OpenSea Studio allowlist CSV (address,limit with the tokens held at the block)"
                  },
                  "minTokens": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3000,
                    "description": "allowlist only: leave out holders with fewer tokens (default 1)"
                  },
                  "excludeContracts": {
                    "type": [
                      "boolean",
                      "array"
                    ],
                    "items": {
                      "type": "string",
                      "pattern": "^0x[0-9a-fA-F]{40}$"
                    },
                    "maxItems": 100,
                    "description": "allowlist only: true leaves out owners with other contract code at the block (Safes, ERC-6551 accounts and EIP-7702 accounts are kept), or a list of up to 100 addresses to leave out"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeB5A7bcF210Ab9d2002c32C940d6F76DA8D9b",
                "export": "opensea-allowlist"
              }
            }
          }
        },
        "x-kokomoji-price": "2.00",
        "x-kokomoji-amount": "2000000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "2000000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/holder-snapshot",
                    "description": "NFT holder snapshot by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "2000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/airdrop-check/check": {
      "post": {
        "operationId": "airdropCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Unknown NFT airdrop check: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract",
                  "tokenId"
                ],
                "description": "One token per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "the NFT contract (ERC-721 or ERC-1155)"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^([0-9]{1,78}|0x[0-9a-fA-F]{1,64})$",
                    "description": "the token id, as a decimal string (or 0x hex), at most a uint256"
                  },
                  "txHash": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{64}$",
                    "description": "optional: the transaction that delivered the token; without it the last event that moved the token is searched"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                "tokenId": "188"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "airdrop-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/airdrop-check": {
      "post": {
        "operationId": "airdropCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Unknown NFT airdrop check: $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 30 per paying wallet a day, 600 for all wallets a day, 3 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract",
                  "tokenId"
                ],
                "description": "One token per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "the NFT contract (ERC-721 or ERC-1155)"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^([0-9]{1,78}|0x[0-9a-fA-F]{1,64})$",
                    "description": "the token id, as a decimal string (or 0x hex), at most a uint256"
                  },
                  "txHash": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{64}$",
                    "description": "optional: the transaction that delivered the token; without it the last event that moved the token is searched"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                "tokenId": "188"
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/airdrop-check",
                    "description": "Unknown NFT airdrop check by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/provenance-trail/check": {
      "post": {
        "operationId": "provenanceTrailCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Token provenance trail: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract",
                  "tokenId"
                ],
                "description": "One ERC-721 token per job. The trail is read at atBlock, or at the head minus 64 blocks on Ethereum (minus 300 on Base), pinned by the free check. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an ERC-721 contract (supportsInterface(0x80ac58cd) must answer true)"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "the token id (a whole number or a decimal string); ownerOf must answer an owner at the block"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block to read the trail at; default and maximum: the head minus 64 (Ethereum) or 300 (Base)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                "tokenId": "296"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "provenance-trail",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.50",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/provenance-trail": {
      "post": {
        "operationId": "provenanceTrail",
        "tags": [
          "jobs"
        ],
        "summary": "Token provenance trail: $0.50 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 500000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 180 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "contract",
                  "tokenId"
                ],
                "description": "One ERC-721 token per job. The trail is read at atBlock, or at the head minus 64 blocks on Ethereum (minus 300 on Base), pinned by the free check. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an ERC-721 contract (supportsInterface(0x80ac58cd) must answer true)"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "the token id (a whole number or a decimal string); ownerOf must answer an owner at the block"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block to read the trail at; default and maximum: the head minus 64 (Ethereum) or 300 (Base)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                "tokenId": "296"
              }
            }
          }
        },
        "x-kokomoji-price": "0.50",
        "x-kokomoji-amount": "500000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "500000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/provenance-trail",
                    "description": "Token provenance trail by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "500000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/eip-explainer/check": {
      "post": {
        "operationId": "eipExplainerCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Ethereum standard explainer: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "standard",
                  "level"
                ],
                "description": "One standard per job. Unknown fields are refused, and so are URLs, repositories, paths and free text. commit is optional: without it the job reads today's snapshot of master (the same commit for every request of the UTC day, so answers are cached).",
                "properties": {
                  "standard": {
                    "type": [
                      "integer",
                      "string"
                    ],
                    "description": "an EIP or ERC number: 20, \"20\", \"ERC-721\", \"erc721\" or \"EIP-1559\"",
                    "pattern": "^((EIP|ERC|eip|erc|Eip|Erc)[ -]?)?[1-9][0-9]{0,4}$",
                    "minimum": 1,
                    "maximum": 99999
                  },
                  "level": {
                    "enum": [
                      "newcomer",
                      "builder"
                    ]
                  },
                  "commit": {
                    "type": "string",
                    "pattern": "^[0-9a-fA-F]{40}$",
                    "description": "a full commit of ethereum/ERCs or ethereum/EIPs in the history of master (checked with the GitHub compare API before any payment; a fork or an unmerged pull request is refused)"
                  },
                  "language": {
                    "enum": [
                      "en"
                    ],
                    "description": "English only in v1"
                  }
                }
              },
              "example": {
                "standard": "ERC-20",
                "level": "newcomer"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "eip-explainer",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.15",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "150000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/eip-explainer": {
      "post": {
        "operationId": "eipExplainer",
        "tags": [
          "jobs"
        ],
        "summary": "Ethereum standard explainer: $0.15 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 150000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 200 for all wallets a day, 2 at once. Closed (503 not_calibrated, before any payment) until its one-time calibration has run.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "standard",
                  "level"
                ],
                "description": "One standard per job. Unknown fields are refused, and so are URLs, repositories, paths and free text. commit is optional: without it the job reads today's snapshot of master (the same commit for every request of the UTC day, so answers are cached).",
                "properties": {
                  "standard": {
                    "type": [
                      "integer",
                      "string"
                    ],
                    "description": "an EIP or ERC number: 20, \"20\", \"ERC-721\", \"erc721\" or \"EIP-1559\"",
                    "pattern": "^((EIP|ERC|eip|erc|Eip|Erc)[ -]?)?[1-9][0-9]{0,4}$",
                    "minimum": 1,
                    "maximum": 99999
                  },
                  "level": {
                    "enum": [
                      "newcomer",
                      "builder"
                    ]
                  },
                  "commit": {
                    "type": "string",
                    "pattern": "^[0-9a-fA-F]{40}$",
                    "description": "a full commit of ethereum/ERCs or ethereum/EIPs in the history of master (checked with the GitHub compare API before any payment; a fork or an unmerged pull request is refused)"
                  },
                  "language": {
                    "enum": [
                      "en"
                    ],
                    "description": "English only in v1"
                  }
                }
              },
              "example": {
                "standard": "ERC-20",
                "level": "newcomer"
              }
            }
          }
        },
        "x-kokomoji-price": "0.15",
        "x-kokomoji-amount": "150000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "150000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/eip-explainer",
                    "description": "Ethereum standard explainer by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "150000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/claim-check/check": {
      "post": {
        "operationId": "claimCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Claim check against pinned sources: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "claim",
                  "topic"
                ],
                "description": "One factual statement per job. No links, no questions, no lists. lang picks the Wikipedia edition (default en).",
                "properties": {
                  "claim": {
                    "type": "string",
                    "minLength": 12,
                    "maxLength": 300
                  },
                  "topic": {
                    "enum": [
                      "general",
                      "science",
                      "ethereum-standards"
                    ],
                    "description": "general: Wikipedia. science: Wikipedia and arXiv. ethereum-standards: EIPs and ERCs at the day's master commit, and Wikipedia."
                  },
                  "lang": {
                    "enum": [
                      "ar",
                      "ca",
                      "cs",
                      "da",
                      "de",
                      "el",
                      "en",
                      "eo",
                      "es",
                      "eu",
                      "fa",
                      "fi",
                      "fr",
                      "he",
                      "hi",
                      "hu",
                      "id",
                      "it",
                      "ja",
                      "ko",
                      "ms",
                      "nl",
                      "no",
                      "pl",
                      "pt",
                      "ro",
                      "ru",
                      "sk",
                      "sr",
                      "sv",
                      "th",
                      "tr",
                      "uk",
                      "vi",
                      "zh"
                    ]
                  }
                }
              },
              "example": {
                "claim": "The Eiffel Tower was completed in 1889.",
                "topic": "general"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "claim-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.10",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/claim-check": {
      "post": {
        "operationId": "claimCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Claim check against pinned sources: $0.10 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 100000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 200 for all wallets a day, 2 at once. Closed (503 not_calibrated, before any payment) until its one-time calibration has run.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "claim",
                  "topic"
                ],
                "description": "One factual statement per job. No links, no questions, no lists. lang picks the Wikipedia edition (default en).",
                "properties": {
                  "claim": {
                    "type": "string",
                    "minLength": 12,
                    "maxLength": 300
                  },
                  "topic": {
                    "enum": [
                      "general",
                      "science",
                      "ethereum-standards"
                    ],
                    "description": "general: Wikipedia. science: Wikipedia and arXiv. ethereum-standards: EIPs and ERCs at the day's master commit, and Wikipedia."
                  },
                  "lang": {
                    "enum": [
                      "ar",
                      "ca",
                      "cs",
                      "da",
                      "de",
                      "el",
                      "en",
                      "eo",
                      "es",
                      "eu",
                      "fa",
                      "fi",
                      "fr",
                      "he",
                      "hi",
                      "hu",
                      "id",
                      "it",
                      "ja",
                      "ko",
                      "ms",
                      "nl",
                      "no",
                      "pl",
                      "pt",
                      "ro",
                      "ru",
                      "sk",
                      "sr",
                      "sv",
                      "th",
                      "tr",
                      "uk",
                      "vi",
                      "zh"
                    ]
                  }
                }
              },
              "example": {
                "claim": "The Eiffel Tower was completed in 1889.",
                "topic": "general"
              }
            }
          }
        },
        "x-kokomoji-price": "0.10",
        "x-kokomoji-amount": "100000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "100000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/claim-check",
                    "description": "Claim check against pinned sources by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/message-explainer/check": {
      "post": {
        "operationId": "messageExplainerCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Crypto message explainer: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "text"
                ],
                "description": "One pasted message per job. Unknown fields are refused. A text holding a recovery phrase, a private key, an extended private key or a keystore file is refused before any payment and is never stored or sent to a model.",
                "properties": {
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 3000,
                    "description": "the message as plain text, at most 3,000 characters; no images, files or attachments"
                  },
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ],
                    "description": "the chain the addresses in the message are read on (default ethereum)"
                  }
                }
              },
              "example": {
                "text": "Congratulations! Your wallet is eligible for the USDC loyalty airdrop. Connect your wallet at https://app.uniswap.org.claim-rewards.xyz/usdc and sign the claim. Token contract: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48.",
                "chain": "ethereum"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "message-explainer",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.15",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "150000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/message-explainer": {
      "post": {
        "operationId": "messageExplainer",
        "tags": [
          "jobs"
        ],
        "summary": "Crypto message explainer: $0.15 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 150000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 90 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "text"
                ],
                "description": "One pasted message per job. Unknown fields are refused. A text holding a recovery phrase, a private key, an extended private key or a keystore file is refused before any payment and is never stored or sent to a model.",
                "properties": {
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 3000,
                    "description": "the message as plain text, at most 3,000 characters; no images, files or attachments"
                  },
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ],
                    "description": "the chain the addresses in the message are read on (default ethereum)"
                  }
                }
              },
              "example": {
                "text": "Congratulations! Your wallet is eligible for the USDC loyalty airdrop. Connect your wallet at https://app.uniswap.org.claim-rewards.xyz/usdc and sign the claim. Token contract: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48.",
                "chain": "ethereum"
              }
            }
          }
        },
        "x-kokomoji-price": "0.15",
        "x-kokomoji-amount": "150000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "150000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/message-explainer",
                    "description": "Crypto message explainer by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "150000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/signature-preview/check": {
      "post": {
        "operationId": "signaturePreviewCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Signature request preview: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "signer"
                ],
                "description": "One signature request per job: typedData or personalSign, never both. Unknown fields are refused, and so are raw eth_sign requests, bare 32-byte hashes, Safe transactions (SafeTx), signatures, keys and seed phrases, and questions such as 'should I sign'.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base",
                      "arbitrum",
                      "optimism"
                    ]
                  },
                  "signer": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "the address that would sign"
                  },
                  "typedData": {
                    "type": [
                      "object",
                      "string"
                    ],
                    "description": "the EIP-712 request exactly as eth_signTypedData_v4 takes it ({types, primaryType, domain, message}, or its JSON text), at most 32 KB, at most 64 struct types, a value depth of 10 and 4,000 values"
                  },
                  "personalSign": {
                    "type": "string",
                    "maxLength": 2000,
                    "description": "the personal_sign message as text, or its 0x hex (a bare 32-byte hash is refused)"
                  },
                  "paragraph": {
                    "type": "boolean",
                    "description": "default true: a 120 to 220 word paragraph written by an AI model from the decoded facts only (a code-written template when the model answer does not pass the checks); false for the facts only"
                  }
                }
              },
              "example": {
                "chain": "base",
                "signer": "0x4c1b034a2264863b6c87130793f818f7f5484261",
                "typedData": {
                  "types": {
                    "EIP712Domain": [
                      {
                        "name": "name",
                        "type": "string"
                      },
                      {
                        "name": "version",
                        "type": "string"
                      },
                      {
                        "name": "chainId",
                        "type": "uint256"
                      },
                      {
                        "name": "verifyingContract",
                        "type": "address"
                      }
                    ],
                    "TransferWithAuthorization": [
                      {
                        "name": "from",
                        "type": "address"
                      },
                      {
                        "name": "to",
                        "type": "address"
                      },
                      {
                        "name": "value",
                        "type": "uint256"
                      },
                      {
                        "name": "validAfter",
                        "type": "uint256"
                      },
                      {
                        "name": "validBefore",
                        "type": "uint256"
                      },
                      {
                        "name": "nonce",
                        "type": "bytes32"
                      }
                    ]
                  },
                  "primaryType": "TransferWithAuthorization",
                  "domain": {
                    "name": "USD Coin",
                    "version": "2",
                    "chainId": 8453,
                    "verifyingContract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
                  },
                  "message": {
                    "from": "0x4c1b034a2264863b6c87130793f818f7f5484261",
                    "to": "0x9fb365e4e9385e2a39febad70368267e6f571d9a",
                    "value": "10000",
                    "validAfter": "1792548180",
                    "validBefore": "1792552080",
                    "nonce": "0xa3ec4a24300a14686f2233b0250f044712931abe71a73d0be15d4e595bb42631"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "signature-preview",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.10",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/signature-preview": {
      "post": {
        "operationId": "signaturePreview",
        "tags": [
          "jobs"
        ],
        "summary": "Signature request preview: $0.10 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 100000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 90 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 50 per paying wallet a day, 1000 for all wallets a day, 2 at once. Closed (503 not_calibrated, before any payment) until its one-time calibration has run.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "signer"
                ],
                "description": "One signature request per job: typedData or personalSign, never both. Unknown fields are refused, and so are raw eth_sign requests, bare 32-byte hashes, Safe transactions (SafeTx), signatures, keys and seed phrases, and questions such as 'should I sign'.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base",
                      "arbitrum",
                      "optimism"
                    ]
                  },
                  "signer": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "the address that would sign"
                  },
                  "typedData": {
                    "type": [
                      "object",
                      "string"
                    ],
                    "description": "the EIP-712 request exactly as eth_signTypedData_v4 takes it ({types, primaryType, domain, message}, or its JSON text), at most 32 KB, at most 64 struct types, a value depth of 10 and 4,000 values"
                  },
                  "personalSign": {
                    "type": "string",
                    "maxLength": 2000,
                    "description": "the personal_sign message as text, or its 0x hex (a bare 32-byte hash is refused)"
                  },
                  "paragraph": {
                    "type": "boolean",
                    "description": "default true: a 120 to 220 word paragraph written by an AI model from the decoded facts only (a code-written template when the model answer does not pass the checks); false for the facts only"
                  }
                }
              },
              "example": {
                "chain": "base",
                "signer": "0x4c1b034a2264863b6c87130793f818f7f5484261",
                "typedData": {
                  "types": {
                    "EIP712Domain": [
                      {
                        "name": "name",
                        "type": "string"
                      },
                      {
                        "name": "version",
                        "type": "string"
                      },
                      {
                        "name": "chainId",
                        "type": "uint256"
                      },
                      {
                        "name": "verifyingContract",
                        "type": "address"
                      }
                    ],
                    "TransferWithAuthorization": [
                      {
                        "name": "from",
                        "type": "address"
                      },
                      {
                        "name": "to",
                        "type": "address"
                      },
                      {
                        "name": "value",
                        "type": "uint256"
                      },
                      {
                        "name": "validAfter",
                        "type": "uint256"
                      },
                      {
                        "name": "validBefore",
                        "type": "uint256"
                      },
                      {
                        "name": "nonce",
                        "type": "bytes32"
                      }
                    ]
                  },
                  "primaryType": "TransferWithAuthorization",
                  "domain": {
                    "name": "USD Coin",
                    "version": "2",
                    "chainId": 8453,
                    "verifyingContract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
                  },
                  "message": {
                    "from": "0x4c1b034a2264863b6c87130793f818f7f5484261",
                    "to": "0x9fb365e4e9385e2a39febad70368267e6f571d9a",
                    "value": "10000",
                    "validAfter": "1792548180",
                    "validBefore": "1792552080",
                    "nonce": "0xa3ec4a24300a14686f2233b0250f044712931abe71a73d0be15d4e595bb42631"
                  }
                }
              }
            }
          }
        },
        "x-kokomoji-price": "0.10",
        "x-kokomoji-amount": "100000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "100000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/signature-preview",
                    "description": "Signature request preview by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/agent-card-writer/check": {
      "post": {
        "operationId": "agentCardWriterCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Agent card writer: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "description": "One agent card per job: {chain, agentId} for a registered ERC-8004 agent (the service reads its card), or {draft} with the registration JSON. Unknown fields are refused; there is no link input.",
                "oneOf": [
                  {
                    "title": "registered agent",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chain",
                      "agentId"
                    ],
                    "properties": {
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base"
                        ],
                        "description": "the chain of the ERC-8004 IdentityRegistry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
                      },
                      "agentId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$",
                        "description": "the agent id, a whole number (a decimal string for ids above 2^53)"
                      },
                      "notes": {
                        "type": "string",
                        "maxLength": 1000,
                        "description": "optional plain text on how the card text should read; no links, no new facts"
                      }
                    }
                  },
                  {
                    "title": "draft",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "draft"
                    ],
                    "properties": {
                      "draft": {
                        "type": [
                          "object",
                          "string"
                        ],
                        "description": "the registration JSON (an object, or its JSON text, which is copied byte for byte), at most 16 KB"
                      },
                      "notes": {
                        "type": "string",
                        "maxLength": 1000,
                        "description": "optional plain text on how the card text should read; no links, no new facts"
                      }
                    }
                  }
                ]
              },
              "example": {
                "chain": "ethereum",
                "agentId": "54304"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "agent-card-writer",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.10",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/agent-card-writer": {
      "post": {
        "operationId": "agentCardWriter",
        "tags": [
          "jobs"
        ],
        "summary": "Agent card writer: $0.10 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 100000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once. Closed (503 not_calibrated, before any payment) until its one-time calibration has run.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "description": "One agent card per job: {chain, agentId} for a registered ERC-8004 agent (the service reads its card), or {draft} with the registration JSON. Unknown fields are refused; there is no link input.",
                "oneOf": [
                  {
                    "title": "registered agent",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "chain",
                      "agentId"
                    ],
                    "properties": {
                      "chain": {
                        "enum": [
                          "ethereum",
                          "base"
                        ],
                        "description": "the chain of the ERC-8004 IdentityRegistry 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
                      },
                      "agentId": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "pattern": "^[0-9]{1,78}$",
                        "description": "the agent id, a whole number (a decimal string for ids above 2^53)"
                      },
                      "notes": {
                        "type": "string",
                        "maxLength": 1000,
                        "description": "optional plain text on how the card text should read; no links, no new facts"
                      }
                    }
                  },
                  {
                    "title": "draft",
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "draft"
                    ],
                    "properties": {
                      "draft": {
                        "type": [
                          "object",
                          "string"
                        ],
                        "description": "the registration JSON (an object, or its JSON text, which is copied byte for byte), at most 16 KB"
                      },
                      "notes": {
                        "type": "string",
                        "maxLength": 1000,
                        "description": "optional plain text on how the card text should read; no links, no new facts"
                      }
                    }
                  }
                ]
              },
              "example": {
                "chain": "ethereum",
                "agentId": "54304"
              }
            }
          }
        },
        "x-kokomoji-price": "0.10",
        "x-kokomoji-amount": "100000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "100000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/agent-card-writer",
                    "description": "Agent card writer by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "100000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/upgrade-check/check": {
      "post": {
        "operationId": "upgradeCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Upgrade history and diff: free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "proxy"
                ],
                "description": "One proxy per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum",
                      "base"
                    ]
                  },
                  "proxy": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one proxy address: EIP-1967 (transparent or UUPS), EIP-1967 beacon, zeppelinos, EIP-1822, Safe proxy or a Compound-style delegator; diamonds (EIP-2535) are not covered in this version"
                  },
                  "newImplementation": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "optional: an implementation you want compared with the current one, labelled 'as supplied by the customer'; it must have code at the block read and must not be (or have been) the proxy's implementation"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional past block to read at; default: the chain head minus the pin lag (2 blocks on Ethereum, about 2 minutes on the L2s)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "proxy": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "upgrade-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "1.00",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "1000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/upgrade-check": {
      "post": {
        "operationId": "upgradeCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Upgrade history and diff: $1.00 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 1000000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 180 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 10 per paying wallet a day, 200 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "proxy"
                ],
                "description": "One proxy per job. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "optimism",
                      "arbitrum",
                      "base"
                    ]
                  },
                  "proxy": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "one proxy address: EIP-1967 (transparent or UUPS), EIP-1967 beacon, zeppelinos, EIP-1822, Safe proxy or a Compound-style delegator; diamonds (EIP-2535) are not covered in this version"
                  },
                  "newImplementation": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "optional: an implementation you want compared with the current one, labelled 'as supplied by the customer'; it must have code at the block read and must not be (or have been) the proxy's implementation"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional past block to read at; default: the chain head minus the pin lag (2 blocks on Ethereum, about 2 minutes on the L2s)"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "proxy": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
              }
            }
          }
        },
        "x-kokomoji-price": "1.00",
        "x-kokomoji-amount": "1000000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "1000000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/upgrade-check",
                    "description": "Upgrade history and diff by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "1000000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/sandwich-check/check": {
      "post": {
        "operationId": "sandwichCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Sandwich check for a past swap (MEV exposure): free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "txHash"
                ],
                "description": "One executed swap transaction per job. The free check pins a block (the head minus 64 on Ethereum; on Base the head minus 300, or the safe block when that is older) and refuses a transaction newer than it. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "txHash": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{64}$",
                    "description": "the hash of a swap transaction already in a block, with at least one Uniswap v2, v3 or v4 Swap event in a Uniswap pool"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "txHash": "0x561e4e61bd90b5eaff99fe954a454867749e97c2868751be056c3462e93f2cab"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "sandwich-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.25",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/sandwich-check": {
      "post": {
        "operationId": "sandwichCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Sandwich check for a past swap (MEV exposure): $0.25 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 250000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 120 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "chain",
                  "txHash"
                ],
                "description": "One executed swap transaction per job. The free check pins a block (the head minus 64 on Ethereum; on Base the head minus 300, or the safe block when that is older) and refuses a transaction newer than it. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "txHash": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{64}$",
                    "description": "the hash of a swap transaction already in a block, with at least one Uniswap v2, v3 or v4 Swap event in a Uniswap pool"
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "txHash": "0x561e4e61bd90b5eaff99fe954a454867749e97c2868751be056c3462e93f2cab"
              }
            }
          }
        },
        "x-kokomoji-price": "0.25",
        "x-kokomoji-amount": "250000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "250000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/sandwich-check",
                    "description": "Sandwich check for a past swap (MEV exposure) by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "250000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/listing-check/check": {
      "post": {
        "operationId": "listingCheckCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Before you list or buy one NFT (step 1): free dry run",
        "description": "Would this input be accepted for Kokomoji {tokenId}, and the exact payment requirements. No model call, no large fetch, nothing charged, no job started. The paid request re-runs every check. Refusals: unknown_job (404); not_registered (404); paused (403, this Kokomoji); unsupported_media_type (415); body_too_large (413); bad_json (400); bad_input (400); input_refused (422); too_expensive (422); rate_limited (429); stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently (503).",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "One ERC-721 token per job: chain, contract and tokenId, or one marketplace link (OpenSea, Blur or Magic Eden item page) parsed to those three fields only and never fetched. The facts are read at atBlock on the token's chain, or at the head minus the pin lag, with the other chain pinned at the same time by the free check. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an ERC-721 contract (supportsInterface(0x80ac58cd) must answer true at the block)"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "the token id; ownerOf must answer an owner at the block"
                  },
                  "link": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "instead of chain, contract and tokenId: https://opensea.io/item/<chain>/<contract>/<id>, https://opensea.io/assets/<chain>/<contract>/<id>, https://blur.io/eth/asset/<contract>/<id> or https://magiceden.io/item-details/<chain>/<contract>/<id>; parsed only, never fetched"
                  },
                  "priceWei": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[1-9][0-9]{0,77}$",
                    "description": "optional sale price in wei: the royalty is read at this price"
                  },
                  "side": {
                    "enum": [
                      "buy",
                      "list"
                    ],
                    "description": "optional: which side you are on (changes the heading only)"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block on the token's chain; default the head minus the pin lag"
                  },
                  "account": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "implementation"
                    ],
                    "description": "optional, collections other than Kokomoji: the ERC-6551 implementation and salt of the token account to derive (only Kokomoji exposes tokenAccount(tokenId))",
                    "properties": {
                      "implementation": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "salt": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "description": "a 32-byte hex word or a whole number; default 0"
                      }
                    }
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                "tokenId": "188",
                "priceWei": "27000000000000000",
                "side": "buy"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The input would be accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                },
                "example": {
                  "ok": true,
                  "wouldAccept": true,
                  "job": "listing-check",
                  "tokenId": 42,
                  "creditedTo": {
                    "tokenId": 42,
                    "agentId": 12345
                  },
                  "price": "0.35",
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "350000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "estimatedSeconds": null,
                  "note": "Dry run: nothing was charged and no job was started. The paid request re-runs every check."
                }
              }
            }
          },
          "400": {
            "description": "Bad input. Codes: bad_input, bad_json, bad_request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Jobs for this Kokomoji are paused. Codes: paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused. Codes: input_refused, too_expensive.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests, or a per-input limit. Codes: rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "503": {
            "description": "Closed for now, before any payment. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          }
        }
      }
    },
    "/jobs/k/{tokenId}/listing-check": {
      "post": {
        "operationId": "listingCheck",
        "tags": [
          "jobs"
        ],
        "summary": "Before you list or buy one NFT (step 1): $0.35 in USDC on Base",
        "description": "Without PAYMENT-SIGNATURE: every free check, then 402 with the requirements (in the PAYMENT-REQUIRED header and the body). With it: the payment must match the requirements rebuilt from this request, use EIP-3009 transferWithAuthorization to 0xb2492145ea92947C0b8dF138a398fcB22782a575 for exactly 350000 (USDC, 6 decimals), have validAfter <= now and now + 270 s <= validBefore <= now + 3600 s, and use a fresh (from, nonce). It is verified (signature, balance, simulated transfer) and the payer is screened against the Chainalysis sanctions oracle. The job gets at most 150 s of work and never runs past validBefore - 30 s. The result is stored, then settled on Base only if the client is still connected and at least 10 s of the window remain. A failed, refused, timed-out or abandoned job is never settled: nothing is taken. Limits: 20 per paying wallet a day, 300 for all wallets a day, 2 at once.",
        "parameters": [
          {
            "$ref": "#/components/parameters/tokenId"
          },
          {
            "$ref": "#/components/parameters/paymentSignature"
          },
          {
            "$ref": "#/components/parameters/jobKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "description": "One ERC-721 token per job: chain, contract and tokenId, or one marketplace link (OpenSea, Blur or Magic Eden item page) parsed to those three fields only and never fetched. The facts are read at atBlock on the token's chain, or at the head minus the pin lag, with the other chain pinned at the same time by the free check. Unknown fields are refused.",
                "properties": {
                  "chain": {
                    "enum": [
                      "ethereum",
                      "base"
                    ]
                  },
                  "contract": {
                    "type": "string",
                    "pattern": "^0x[0-9a-fA-F]{40}$",
                    "description": "an ERC-721 contract (supportsInterface(0x80ac58cd) must answer true at the block)"
                  },
                  "tokenId": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,78}$",
                    "description": "the token id; ownerOf must answer an owner at the block"
                  },
                  "link": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "instead of chain, contract and tokenId: https://opensea.io/item/<chain>/<contract>/<id>, https://opensea.io/assets/<chain>/<contract>/<id>, https://blur.io/eth/asset/<contract>/<id> or https://magiceden.io/item-details/<chain>/<contract>/<id>; parsed only, never fetched"
                  },
                  "priceWei": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[1-9][0-9]{0,77}$",
                    "description": "optional sale price in wei: the royalty is read at this price"
                  },
                  "side": {
                    "enum": [
                      "buy",
                      "list"
                    ],
                    "description": "optional: which side you are on (changes the heading only)"
                  },
                  "atBlock": {
                    "type": [
                      "string",
                      "integer"
                    ],
                    "pattern": "^[0-9]{1,12}$",
                    "description": "optional block on the token's chain; default the head minus the pin lag"
                  },
                  "account": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "implementation"
                    ],
                    "description": "optional, collections other than Kokomoji: the ERC-6551 implementation and salt of the token account to derive (only Kokomoji exposes tokenAccount(tokenId))",
                    "properties": {
                      "implementation": {
                        "type": "string",
                        "pattern": "^0x[0-9a-fA-F]{40}$"
                      },
                      "salt": {
                        "type": [
                          "string",
                          "integer"
                        ],
                        "description": "a 32-byte hex word or a whole number; default 0"
                      }
                    }
                  }
                }
              },
              "example": {
                "chain": "ethereum",
                "contract": "0x44eeb5a7bcf210ab9d2002c32c940d6f76da8d9b",
                "tokenId": "188",
                "priceWei": "27000000000000000",
                "side": "buy"
              }
            }
          }
        },
        "x-kokomoji-price": "0.35",
        "x-kokomoji-amount": "350000",
        "x-x402-accepts": [
          {
            "scheme": "exact",
            "network": "eip155:8453",
            "amount": "350000",
            "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
            "maxTimeoutSeconds": 300,
            "extra": {
              "name": "USD Coin",
              "version": "2"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivered and settled. The settlement is also in the PAYMENT-RESPONSE header.",
            "headers": {
              "PAYMENT-RESPONSE": {
                "$ref": "#/components/headers/PAYMENT-RESPONSE"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/DeliveredResult"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "result": {
                          "$ref": "#/components/schemas/SkillResult"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The result is ready but the settlement is not confirmed yet. If it settles within the payment window, the result appears at resultUrl and at /jobs/key; if not, nothing is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettlementPending"
                }
              }
            }
          },
          "400": {
            "description": "Bad input or a malformed header. Codes: bad_input, bad_json, bad_request, bad_payment_header, bad_job_key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required, or the payment was refused, or it could not be settled (result withheld). Nothing was charged.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "$ref": "#/components/headers/PAYMENT-REQUIRED"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                },
                "example": {
                  "x402Version": 2,
                  "error": "payment_required",
                  "resource": {
                    "url": "https://jobs.kokomoji.art/jobs/k/42/listing-check",
                    "description": "Before you list or buy one NFT (step 1) by Kokomoji #42 (Kokomoji job service)",
                    "mimeType": "application/json"
                  },
                  "accepts": [
                    {
                      "scheme": "exact",
                      "network": "eip155:8453",
                      "amount": "350000",
                      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                      "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
                      "maxTimeoutSeconds": 300,
                      "extra": {
                        "name": "USD Coin",
                        "version": "2"
                      }
                    }
                  ],
                  "message": "Payment required"
                }
              }
            }
          },
          "403": {
            "description": "This wallet can't use the service, or jobs for this Kokomoji are paused. Codes: payer_refused, paused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job or a Kokomoji that takes no jobs. Codes: unknown_job, not_registered.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The authorization or the X-Job-Key was already used. Codes: authorization_used, job_key_used.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Body over 160 KB. Codes: body_too_large.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "415": {
            "description": "Not application/json. Codes: unsupported_media_type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Input refused before payment, or the job found the input unusable (nothing charged). Codes: input_refused, too_expensive, job_refused.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "A limit of this wallet, or too many requests. Codes: payer_busy, payer_daily_limit, payer_failed_limit, rate_limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "500": {
            "description": "The job failed on our side. Nothing was charged. Codes: job_failed, internal_error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "An upstream the job needs failed. Nothing was charged. Codes: job_failed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Closed, busy or a check could not run. Nothing was charged. Codes: stopped, restarting, registry_unavailable, paused, not_calibrated, not_ready, busy, daily_cap, daily_budget, failed_budget, check_unavailable, input_failed_recently, verify_unavailable, screening_unavailable, unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            }
          },
          "504": {
            "description": "The job ran out of time, or the payment window closed before settlement. Nothing was charged. Codes: job_timeout, window_closing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error",
          "message"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "A short code, for example not_registered, bad_input, busy."
          },
          "message": {
            "type": "string",
            "description": "Plain English. Says when nothing was charged."
          },
          "jobId": {
            "type": "string",
            "pattern": "^[0-9a-f]{32}$",
            "description": "Only on a paid request that was accepted and then failed."
          },
          "charged": {
            "const": false,
            "description": "Only on a paid request that was accepted and then failed: nothing was charged."
          }
        }
      },
      "PaymentRequirements": {
        "type": "object",
        "description": "The one payment option of a job (x402 v2). amount is in USDC's 6-decimal units.",
        "required": [
          "scheme",
          "network",
          "amount",
          "asset",
          "payTo",
          "maxTimeoutSeconds",
          "extra"
        ],
        "properties": {
          "scheme": {
            "const": "exact"
          },
          "network": {
            "const": "eip155:8453"
          },
          "amount": {
            "type": "string",
            "pattern": "^[0-9]+$"
          },
          "asset": {
            "const": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
          },
          "payTo": {
            "const": "0xb2492145ea92947C0b8dF138a398fcB22782a575"
          },
          "maxTimeoutSeconds": {
            "const": 300
          },
          "extra": {
            "type": "object",
            "properties": {
              "name": {
                "const": "USD Coin"
              },
              "version": {
                "const": "2"
              }
            }
          }
        }
      },
      "PaymentRequired": {
        "type": "object",
        "description": "The 402 body. The same object (with error \"Payment required\" and without message) is base64 JSON in the PAYMENT-REQUIRED header.",
        "required": [
          "x402Version",
          "resource",
          "accepts",
          "error",
          "message"
        ],
        "properties": {
          "x402Version": {
            "const": 2
          },
          "error": {
            "type": "string",
            "description": "payment_required on a first request; otherwise why the payment was refused, for example authorization_window_too_short, x402_v2_only, wrong_amount, settlement_failed."
          },
          "message": {
            "type": "string"
          },
          "resource": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string",
                "format": "uri"
              },
              "description": {
                "type": "string"
              },
              "mimeType": {
                "const": "application/json"
              }
            }
          },
          "accepts": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "$ref": "#/components/schemas/PaymentRequirements"
            }
          }
        }
      },
      "CheckResult": {
        "type": "object",
        "required": [
          "ok",
          "wouldAccept",
          "job",
          "tokenId",
          "creditedTo",
          "price",
          "accepts"
        ],
        "properties": {
          "ok": {
            "const": true
          },
          "wouldAccept": {
            "const": true
          },
          "job": {
            "type": "string"
          },
          "tokenId": {
            "type": "integer"
          },
          "creditedTo": {
            "type": "object",
            "properties": {
              "tokenId": {
                "type": "integer"
              },
              "agentId": {
                "type": "integer"
              }
            }
          },
          "price": {
            "type": "string",
            "description": "USD decimal string, paid in USDC on Base."
          },
          "accepts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentRequirements"
            }
          },
          "estimatedSeconds": {
            "type": [
              "integer",
              "null"
            ]
          },
          "note": {
            "type": "string"
          }
        }
      },
      "CreditedTo": {
        "type": "object",
        "description": "The Kokomoji credited with the job. It gets credit and a public record, never money.",
        "required": [
          "tokenId",
          "agentId",
          "label"
        ],
        "properties": {
          "tokenId": {
            "type": "integer"
          },
          "agentId": {
            "type": "integer",
            "description": "Its ERC-8004 agent ID (the lowest one bound with its kokomoji.art card)."
          },
          "label": {
            "type": "string"
          },
          "signOff": {
            "type": "string",
            "description": "Only on jobs with a sign-off (the art critique)."
          }
        }
      },
      "StoredResult": {
        "type": "object",
        "required": [
          "jobId",
          "job",
          "jobName",
          "status",
          "createdAt",
          "completedAt",
          "inputSha256",
          "result",
          "creditedTo",
          "performedBy",
          "price",
          "settlement",
          "terms"
        ],
        "properties": {
          "jobId": {
            "type": "string",
            "pattern": "^[0-9a-f]{32}$",
            "description": "128-bit random. Anyone with it can read the result: share it only on purpose."
          },
          "job": {
            "type": "string"
          },
          "jobName": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "\"settled\" from /jobs/r/{jobId}; \"delivered\" on the paid answer and on /jobs/key."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputSha256": {
            "type": "string",
            "description": "SHA-256 of the input as the service ran it."
          },
          "result": {
            "type": "object"
          },
          "creditedTo": {
            "$ref": "#/components/schemas/CreditedTo"
          },
          "performedBy": {
            "type": "string"
          },
          "price": {
            "type": "string"
          },
          "settlement": {
            "type": "object",
            "properties": {
              "network": {
                "const": "eip155:8453"
              },
              "transaction": {
                "type": "string",
                "pattern": "^0x[0-9a-fA-F]{64}$"
              }
            }
          },
          "terms": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "DeliveredResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/StoredResult"
          },
          {
            "type": "object",
            "required": [
              "ok",
              "status",
              "resultUrl"
            ],
            "properties": {
              "ok": {
                "const": true
              },
              "status": {
                "const": "delivered"
              },
              "replay": {
                "type": "boolean",
                "description": "false on /jobs/key; true when a repeated paid request with the same authorization and X-Job-Key gets the stored result again; absent on the first paid answer."
              },
              "resultUrl": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        ]
      },
      "SettlementPending": {
        "type": "object",
        "required": [
          "jobId",
          "status",
          "charged",
          "resultUrl",
          "message"
        ],
        "properties": {
          "jobId": {
            "type": "string"
          },
          "status": {
            "const": "settlement_pending"
          },
          "charged": {
            "const": "unknown"
          },
          "resultUrl": {
            "type": "string",
            "format": "uri"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "KeyStatus": {
        "type": "object",
        "description": "/jobs/key for a job that was not delivered (yet).",
        "required": [
          "ok",
          "status",
          "result",
          "message"
        ],
        "properties": {
          "ok": {
            "const": true
          },
          "status": {
            "enum": [
              "running",
              "settlement_pending",
              "not_charged"
            ]
          },
          "result": {
            "type": "null"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "DaoResult": {
        "type": "object",
        "description": "The result of proposal-explainer, proposal-simulation, dao-health-check. Written by code, no AI.",
        "required": [
          "format",
          "job",
          "summary",
          "report",
          "markdown",
          "evidence"
        ],
        "properties": {
          "format": {
            "const": "kokomoji.jobs.dao/1"
          },
          "job": {
            "type": "string"
          },
          "summary": {
            "type": "object",
            "properties": {
              "flagCounts": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "review_first": {
                    "type": "integer"
                  },
                  "worth_checking": {
                    "type": "integer"
                  },
                  "info": {
                    "type": "integer"
                  }
                }
              },
              "reviewFirstPointsToConfirm": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "simulated": {
                "type": "boolean"
              },
              "block": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "The block the report was read at."
              },
              "writtenBy": {
                "const": "code (no AI in this job)"
              }
            }
          },
          "report": {
            "type": "object",
            "description": "The whole report as JSON (schema kokomoji.dao.explainer/1 or the health check's)."
          },
          "markdown": {
            "type": "string",
            "description": "The same report as Markdown."
          },
          "evidence": {
            "type": [
              "object",
              "null"
            ],
            "description": "Every chain read behind the report, with a cast command to repeat it. Replaced by {omitted: true, reason, reads} when too large."
          }
        }
      },
      "SkillResult": {
        "type": "object",
        "description": "The result of chain-answer, chain-answer-question, transfer-rules-check, send-check, token-facts, governance-watch, approval-check, delegation-check, multisig-profile, agent-card-check, x402-payee-check, token-flow, permissions-map, mint-contract-check, holder-snapshot, airdrop-check, provenance-trail, eip-explainer, claim-check, message-explainer, signature-preview, agent-card-writer, upgrade-check, sandwich-check, listing-check: a fact sheet read at pinned blocks or from pinned source versions (a commit, a revision id, a paper version). Every compared field is an integer or a decimal string; resultHash is the canonical hash of the compared view (dao/engine consensus.js), the same on every machine that re-reads the same blocks and sources. Written by code, except the parts marked AI-written: chain-answer-question's answer text, and the prose of the central AI skills (eip-explainer, claim-check, message-explainer, signature-preview, agent-card-writer), which code checks (quotes found verbatim in the pinned source, wording lints). Where AI-written text is in the compared view, resultHash fixes the delivered text; a fresh run of the models need not reproduce it.",
        "required": [
          "format",
          "job",
          "resultHash",
          "report"
        ],
        "properties": {
          "format": {
            "enum": [
              "kokomoji.jobs.agent-card-check/1",
              "kokomoji.jobs.agent-card-writer/1",
              "kokomoji.jobs.airdrop-check/1",
              "kokomoji.jobs.approval-check/1",
              "kokomoji.jobs.chain-answer/1",
              "kokomoji.jobs.claim-check/1",
              "kokomoji.jobs.delegation-check/1",
              "kokomoji.jobs.eip-explainer/1",
              "kokomoji.jobs.governance-watch/1",
              "kokomoji.jobs.holder-snapshot/1",
              "kokomoji.jobs.listing-check/1",
              "kokomoji.jobs.message-explainer/1",
              "kokomoji.jobs.mint-contract-check/1",
              "kokomoji.jobs.multisig-profile/1",
              "kokomoji.jobs.permissions-map/1",
              "kokomoji.jobs.provenance-trail/1",
              "kokomoji.jobs.sandwich-check/1",
              "kokomoji.jobs.send-check/1",
              "kokomoji.jobs.signature-preview/1",
              "kokomoji.jobs.token-facts/1",
              "kokomoji.jobs.token-flow/1",
              "kokomoji.jobs.transfer-rules-check/1",
              "kokomoji.jobs.upgrade-check/1",
              "kokomoji.jobs.x402-payee-check/1"
            ],
            "description": "kokomoji.jobs.<runner>/1 (the catalog's runner field: chain-answer-question uses kokomoji.jobs.chain-answer/1)"
          },
          "job": {
            "enum": [
              "chain-answer",
              "chain-answer-question",
              "transfer-rules-check",
              "send-check",
              "token-facts",
              "governance-watch",
              "approval-check",
              "delegation-check",
              "multisig-profile",
              "agent-card-check",
              "x402-payee-check",
              "token-flow",
              "permissions-map",
              "mint-contract-check",
              "holder-snapshot",
              "airdrop-check",
              "provenance-trail",
              "eip-explainer",
              "claim-check",
              "message-explainer",
              "signature-preview",
              "agent-card-writer",
              "upgrade-check",
              "sandwich-check",
              "listing-check"
            ]
          },
          "resultHash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$",
            "description": "The hash of the compared view of report."
          },
          "summary": {
            "type": "object",
            "description": "A few headline facts (shape per job)."
          },
          "report": {
            "type": "object",
            "description": "The whole fact sheet as JSON (schema kokomoji.<skill>/1). Reads no endpoint answered are explicit unreadable entries, never zero."
          },
          "markdown": {
            "type": "string",
            "description": "The same fact sheet as Markdown (not in chain-answer)."
          },
          "writtenBy": {
            "type": "string"
          }
        }
      },
      "CritiqueResult": {
        "type": "object",
        "description": "The result of art-critique. AI output from a vision model, named in model.",
        "required": [
          "job",
          "nft",
          "scores",
          "overall",
          "headline",
          "verdict",
          "review",
          "model"
        ],
        "properties": {
          "job": {
            "const": "art-critique"
          },
          "nft": {
            "type": "object",
            "properties": {
              "chain": {
                "enum": [
                  "ethereum",
                  "base"
                ]
              },
              "chainId": {
                "type": "integer"
              },
              "contract": {
                "type": "string"
              },
              "tokenId": {
                "type": "string"
              }
            }
          },
          "collection": {
            "type": [
              "string",
              "null"
            ]
          },
          "scores": {
            "type": "object",
            "properties": {
              "color_harmony": {
                "type": "number"
              },
              "composition": {
                "type": "number"
              },
              "expression": {
                "type": "number"
              },
              "synergy": {
                "type": "number"
              }
            }
          },
          "overall": {
            "type": "number"
          },
          "headline": {
            "type": "string"
          },
          "verdict": {
            "type": "string"
          },
          "review": {
            "type": "string"
          },
          "imageSha256": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "responseModel": {
            "type": [
              "string",
              "null"
            ],
            "description": "The model name the provider reported, or null when it named none."
          },
          "calibrationVersion": {
            "type": "string"
          },
          "cached": {
            "type": "boolean"
          },
          "imageSource": {
            "type": "string"
          },
          "replaced": {
            "type": "array"
          },
          "scale": {
            "type": "string"
          },
          "performedBy": {
            "type": "string"
          }
        }
      },
      "DeliveryStats": {
        "type": "object",
        "properties": {
          "delivered": {
            "type": "integer"
          },
          "failedOnOurSide": {
            "type": "integer"
          },
          "notCompleted": {
            "type": "integer",
            "description": "Ended on the payer's side: bad input, refused content, a disconnect, moved funds."
          },
          "successRate": {
            "type": [
              "number",
              "null"
            ],
            "description": "delivered / (delivered + failedOnOurSide)."
          },
          "medianSeconds": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      },
      "KokomojiPage": {
        "type": "object",
        "required": [
          "tokenId",
          "takesJobs",
          "jobs",
          "record",
          "history",
          "catalog",
          "terms",
          "disclosure"
        ],
        "properties": {
          "tokenId": {
            "type": "integer"
          },
          "takesJobs": {
            "type": "boolean"
          },
          "agentId": {
            "type": "integer"
          },
          "creditedAs": {
            "type": "string"
          },
          "reason": {
            "type": "string",
            "description": "Why it takes no jobs (only when takesJobs is false)."
          },
          "signOff": {
            "type": "string"
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "endpoint": {
                  "type": "string"
                },
                "check": {
                  "type": "string"
                }
              }
            }
          },
          "record": {
            "type": "object",
            "properties": {
              "jobsCredited": {
                "type": "integer"
              },
              "byJob": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "last30d": {
                "$ref": "#/components/schemas/DeliveryStats"
              }
            }
          },
          "history": {
            "type": "string",
            "format": "uri"
          },
          "catalog": {
            "type": "string",
            "format": "uri"
          },
          "terms": {
            "type": "string",
            "format": "uri"
          },
          "disclosure": {
            "type": "string"
          }
        }
      },
      "History": {
        "type": "object",
        "required": [
          "tokenId",
          "jobs",
          "note"
        ],
        "properties": {
          "tokenId": {
            "type": "integer"
          },
          "jobs": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "object",
              "required": [
                "job",
                "at",
                "status"
              ],
              "properties": {
                "job": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "status": {
                  "enum": [
                    "delivered",
                    "failed",
                    "not completed",
                    "in progress"
                  ]
                },
                "tx": {
                  "type": "string",
                  "description": "The settlement transaction on Base, for delivered jobs."
                }
              }
            }
          },
          "note": {
            "type": "string"
          }
        }
      },
      "Status": {
        "type": "object",
        "required": [
          "service",
          "updated",
          "accepting",
          "jobs",
          "queue",
          "today",
          "last30d",
          "settlement",
          "float",
          "registry",
          "manualRefunds",
          "onchainFeedback"
        ],
        "properties": {
          "service": {
            "const": "Kokomoji jobs"
          },
          "updated": {
            "type": "string",
            "format": "date-time"
          },
          "accepting": {
            "type": "boolean"
          },
          "stopped": {
            "type": "boolean"
          },
          "draining": {
            "type": "boolean"
          },
          "pausedAll": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "reason": {
                "type": "string"
              }
            }
          },
          "jobs": {
            "type": "object",
            "description": "Per job id: state available, busy, paused, unavailable or disabled, with status, code and reason when it is not available.",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "state": {
                  "enum": [
                    "available",
                    "busy",
                    "paused",
                    "unavailable",
                    "disabled"
                  ]
                },
                "status": {
                  "type": "integer"
                },
                "code": {
                  "type": "string"
                },
                "reason": {
                  "type": "string"
                }
              }
            }
          },
          "queue": {
            "type": "object"
          },
          "today": {
            "type": "object",
            "properties": {
              "day": {
                "type": "string"
              },
              "accepted": {
                "type": "integer"
              },
              "delivered": {
                "type": "integer"
              },
              "failedOnOurSide": {
                "type": "integer"
              },
              "notCompleted": {
                "type": "integer"
              }
            }
          },
          "last30d": {
            "$ref": "#/components/schemas/DeliveryStats"
          },
          "settlement": {
            "type": "object",
            "properties": {
              "network": {
                "const": "eip155:8453"
              },
              "lastSettledAt": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "failuresInWindow": {
                "type": "integer"
              }
            }
          },
          "float": {
            "type": "object",
            "properties": {
              "gas": {
                "enum": [
                  "ok",
                  "low",
                  "unknown"
                ]
              },
              "ai": {
                "enum": [
                  "ok",
                  "low",
                  "unknown"
                ]
              }
            }
          },
          "registry": {
            "type": "object",
            "properties": {
              "loaded": {
                "type": "boolean"
              },
              "block": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "kokomojis": {
                "type": "integer"
              }
            }
          },
          "manualRefunds": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "tx": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "at": {
                  "type": "string"
                },
                "job": {
                  "type": "string"
                }
              }
            }
          },
          "onchainFeedback": {
            "const": "off"
          },
          "catalog": {
            "type": "string"
          },
          "terms": {
            "type": "string"
          }
        }
      },
      "Stats": {
        "type": "object",
        "required": [
          "schema",
          "service",
          "updated",
          "revenueUsdc",
          "delivered",
          "failedUncharged",
          "jobs",
          "byDay"
        ],
        "properties": {
          "schema": {
            "const": "kokomoji.jobs.stats/1"
          },
          "service": {
            "const": "Kokomoji jobs"
          },
          "updated": {
            "type": "string",
            "format": "date-time"
          },
          "refreshSeconds": {
            "type": "integer"
          },
          "day": {
            "type": "string",
            "description": "Today (UTC)."
          },
          "since": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "The first job in the journal."
          },
          "currency": {
            "const": "USDC"
          },
          "network": {
            "const": "eip155:8453"
          },
          "revenueUsdc": {
            "type": "object",
            "description": "USDC of settled job payments, as decimal strings.",
            "properties": {
              "last24h": {
                "type": "string"
              },
              "last7d": {
                "type": "string"
              },
              "last30d": {
                "type": "string"
              },
              "allTime": {
                "type": "string"
              }
            }
          },
          "delivered": {
            "type": "object",
            "properties": {
              "last24h": {
                "type": "integer"
              },
              "last7d": {
                "type": "integer"
              },
              "last30d": {
                "type": "integer"
              },
              "allTime": {
                "type": "integer"
              }
            }
          },
          "failedUncharged": {
            "type": "object",
            "properties": {
              "last24h": {
                "type": "integer"
              },
              "last7d": {
                "type": "integer"
              },
              "last30d": {
                "type": "integer"
              },
              "allTime": {
                "type": "integer"
              }
            }
          },
          "notCompleted": {
            "type": "object",
            "properties": {
              "last24h": {
                "type": "integer"
              },
              "last7d": {
                "type": "integer"
              },
              "last30d": {
                "type": "integer"
              },
              "allTime": {
                "type": "integer"
              }
            }
          },
          "inProgress": {
            "type": "integer"
          },
          "averageJobSeconds": {
            "type": "object",
            "properties": {
              "last30d": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "allTime": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "distinctPayers": {
            "type": "object",
            "description": "Counts only.",
            "properties": {
              "last30d": {
                "type": "integer"
              },
              "allTime": {
                "type": "integer"
              }
            }
          },
          "aiSpendUsd": {
            "type": "object",
            "properties": {
              "last30d": {
                "type": "number"
              },
              "allTime": {
                "type": "number"
              }
            }
          },
          "jobsOffered": {
            "type": "integer"
          },
          "jobsLive": {
            "type": "integer"
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "price": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "available": {
                  "type": "boolean"
                },
                "delivered": {
                  "type": "integer"
                },
                "delivered30d": {
                  "type": "integer"
                },
                "failedUncharged": {
                  "type": "integer"
                }
              }
            }
          },
          "byDay": {
            "type": "array",
            "description": "The last 30 UTC days, oldest first.",
            "items": {
              "type": "object",
              "properties": {
                "day": {
                  "type": "string"
                },
                "delivered": {
                  "type": "integer"
                },
                "failedUncharged": {
                  "type": "integer"
                },
                "revenueUsdc": {
                  "type": "string"
                }
              }
            }
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Catalog": {
        "type": "object",
        "description": "The live catalog: every offered job with its price, input schema, example, limits, refusals and current status, plus the payment terms.",
        "required": [
          "format",
          "version",
          "service",
          "performedBy",
          "disclosure",
          "payment",
          "routing",
          "results",
          "reputation",
          "terms",
          "jobs"
        ],
        "properties": {
          "format": {
            "const": 1
          },
          "version": {
            "type": "string"
          },
          "service": {
            "const": "Kokomoji jobs"
          },
          "performedBy": {
            "type": "string"
          },
          "disclosure": {
            "type": "string"
          },
          "payment": {
            "type": "object"
          },
          "routing": {
            "type": "object"
          },
          "results": {
            "type": "object"
          },
          "reputation": {
            "type": "object"
          },
          "terms": {
            "type": "string"
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "price": {
                  "type": "string"
                },
                "amount": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "endpoint": {
                  "type": "string"
                },
                "check": {
                  "type": "string"
                },
                "input": {
                  "type": "object"
                },
                "example": {
                  "type": "object"
                },
                "limits": {
                  "type": "object"
                },
                "refused": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "status": {
                  "type": "string"
                },
                "statusReason": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "parameters": {
      "tokenId": {
        "name": "tokenId",
        "in": "path",
        "required": true,
        "description": "The Kokomoji's number. Only Kokomojis registered as an ERC-8004 agent with their kokomoji.art card take jobs.",
        "schema": {
          "type": "string",
          "pattern": "^[1-9][0-9]{0,3}$"
        },
        "example": "42"
      },
      "jobId": {
        "name": "jobId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[0-9a-f]{32}$"
        }
      },
      "jobKeyOptional": {
        "name": "X-Job-Key",
        "in": "header",
        "required": false,
        "description": "Your own random key (22 to 128 characters of A-Z, a-z, 0-9, _ or -, at least 8 different: 16 or more random bytes, base64url). Send it with the paid request to fetch the result again from /jobs/key if the connection drops. One key per job.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_-]{22,128}$"
        }
      },
      "jobKeyRequired": {
        "name": "X-Job-Key",
        "in": "header",
        "required": true,
        "description": "The X-Job-Key you sent with the paid request.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_-]{22,128}$"
        }
      },
      "paymentSignature": {
        "name": "PAYMENT-SIGNATURE",
        "in": "header",
        "required": false,
        "description": "The x402 v2 payment payload, base64 JSON (at most 8192 characters). Leave it out to get the 402 with the requirements. The x402 v1 X-PAYMENT header is refused.",
        "schema": {
          "type": "string",
          "maxLength": 8192
        }
      }
    },
    "headers": {
      "PAYMENT-REQUIRED": {
        "description": "The PaymentRequired object as base64 JSON (x402 v2).",
        "schema": {
          "type": "string"
        }
      },
      "PAYMENT-RESPONSE": {
        "description": "The settlement as base64 JSON: {success, transaction, network, payer}.",
        "schema": {
          "type": "string"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before trying again. Sent with most 429 and 503 answers. A 503 after the payment was accepted (one with jobId and charged: false) has none: wait about a minute.",
        "schema": {
          "type": "string"
        }
      }
    }
  },
  "x-kokomoji-payment": {
    "x402Version": 2,
    "scheme": "exact",
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "assetName": "USDC",
    "decimals": 6,
    "eip712Domain": {
      "name": "USD Coin",
      "version": "2"
    },
    "transferMethod": "eip3009",
    "payTo": "0xb2492145ea92947C0b8dF138a398fcB22782a575",
    "maxTimeoutSeconds": 300,
    "minAuthorizationSeconds": 270,
    "maxAuthorizationSeconds": 3600,
    "charged": "only when the job is delivered"
  },
  "x-kokomoji-jobs": [
    {
      "id": "proposal-explainer",
      "name": "DAO proposal explainer",
      "price": "1.00",
      "amount": "1000000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 10,
        "globalPerDay": 50,
        "maxConcurrent": 2
      },
      "lanes": [
        "dao"
      ],
      "refused": [
        "Arbitrum and OP governors",
        "Aave Governance v3",
        "Aragon OSx",
        "Snapshot votes and oSnap payloads",
        "non-EVM chains",
        "batches of proposals or lists of DAOs",
        "requests to find weaknesses, estimate takeover costs or write proposals"
      ]
    },
    {
      "id": "proposal-simulation",
      "name": "DAO proposal explainer with fork simulation",
      "price": "2.50",
      "amount": "2500000",
      "usesAi": false,
      "timeoutSeconds": 200,
      "limits": {
        "perPayerPerDay": 3,
        "globalPerDay": 20,
        "maxConcurrent": 1
      },
      "lanes": [
        "dao",
        "fork"
      ],
      "refused": [
        "everything the proposal explainer refuses",
        "simulation outside Ethereum mainnet"
      ]
    },
    {
      "id": "dao-health-check",
      "name": "DAO health check",
      "price": "2.00",
      "amount": "2000000",
      "usesAi": false,
      "timeoutSeconds": 200,
      "limits": {
        "perPayerPerDay": 3,
        "globalPerDay": 20,
        "maxConcurrent": 1
      },
      "lanes": [
        "dao",
        "health"
      ],
      "refused": [
        "rankings or comparisons of DAOs",
        "linking addresses to people",
        "takeover cost estimates"
      ]
    },
    {
      "id": "art-critique",
      "name": "Art critique",
      "price": "0.10",
      "amount": "100000",
      "usesAi": true,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 100,
        "maxConcurrent": 2
      },
      "requiresCalibration": true,
      "refused": [
        "adult content",
        "hate",
        "gore",
        "self harm",
        "real people",
        "text-heavy images",
        "placeholders",
        "images that are not artwork",
        "image URLs (NFT references only)"
      ]
    },
    {
      "id": "chain-answer",
      "name": "Chain answer, recounted by Kokomojis",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 30,
        "globalPerDay": 300,
        "maxConcurrent": 4
      },
      "lanes": [
        "reads"
      ],
      "refused": [
        "prices, USD values, market figures and price feeds (price, rate and oracle view functions, and windows over swap, sync and oracle answer events, included)",
        "predictions, rankings and advice",
        "who is behind a wallet or an address",
        "anything that is not a chain fact at a block",
        "signed attestations, and answers for settling contracts or bets",
        "state-changing calls and anything that sends, signs or approves"
      ]
    },
    {
      "id": "chain-answer-question",
      "name": "Chain answer from a question",
      "price": "0.25",
      "amount": "250000",
      "usesAi": true,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 150,
        "maxConcurrent": 4
      },
      "lanes": [
        "reads"
      ],
      "refused": [
        "prices, USD values, market figures and price feeds (price, rate and oracle view functions, and windows over swap, sync and oracle answer events, included)",
        "predictions, rankings and advice",
        "who is behind a wallet or an address",
        "anything that is not a chain fact at a block",
        "signed attestations, and answers for settling contracts or bets",
        "state-changing calls and anything that sends, signs or approves"
      ]
    },
    {
      "id": "transfer-rules-check",
      "name": "Royalty and transfer rules check",
      "price": "0.30",
      "amount": "300000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "transfer-rules-check"
      ],
      "refused": [
        "contracts that do not report the ERC-721 interface",
        "more than one collection, scanning or comparing collections",
        "more than 5 token ids or more than one wallet",
        "marketplace recommendations or help getting around a collection's rules"
      ]
    },
    {
      "id": "send-check",
      "name": "Before-you-send address check",
      "price": "0.20",
      "amount": "200000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 100,
        "globalPerDay": 2000,
        "maxConcurrent": 4
      },
      "lanes": [
        "wallet-check"
      ],
      "refused": [
        "lists, batches and bulk screening (one address per job)",
        "questions such as whether an address is safe, who owns it or whether it is a known scammer",
        "resolving an address to a person or an identity (no reverse ENS)",
        "the from address of the later lookalike and dust check",
        "non-EVM addresses",
        "chains other than Ethereum, Base, Arbitrum One and OP Mainnet",
        ".eth names that do not resolve on-chain (off-chain and wildcard resolvers are not followed)"
      ]
    },
    {
      "id": "token-facts",
      "name": "Token fact sheet",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 180,
      "limits": {
        "perPayerPerDay": 30,
        "globalPerDay": 300,
        "maxConcurrent": 4
      },
      "lanes": [
        "chain-facts"
      ],
      "refused": [
        "buy or sell advice and price targets",
        "verdicts about the token",
        "sell or buy simulation",
        "lists, rankings and comparisons",
        "more than one token per job",
        "EOAs and NFTs",
        "who the holders are"
      ]
    },
    {
      "id": "governance-watch",
      "name": "Governance digest",
      "price": "0.50",
      "amount": "500000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "governance"
      ],
      "refused": [
        "governors on Arbitrum, Optimism or Base",
        "Tornado-style, custom, GovernorAlpha-style, hash-only and Snapshot governors",
        "Aave Governance v3 and other non-Governor DAOs",
        "more than one governor per job",
        "windows over 200,000 blocks or ending less than 64 blocks before the head",
        "rankings, delegate scores, per-voter lists, predictions and voting advice",
        "push alerts, subscriptions and schedules"
      ]
    },
    {
      "id": "approval-check",
      "name": "Open approvals check",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 30,
        "globalPerDay": 1000,
        "maxConcurrent": 4
      },
      "lanes": [
        "wallet-check"
      ],
      "refused": [
        "more than one owner, owner lists and batches",
        "reverse lookup by spender or operator",
        "rankings and lists of wallets",
        "questions such as whether a spender is malicious, and any grade or score",
        "signing, sending or executing a revoke (the calldata is unsigned)",
        "USD values and exposure totals",
        "Base and every chain other than Ethereum, OP Mainnet and Arbitrum One",
        "owners over the activity gate (more than 5,000 transactions, or more approval logs than one job reads)"
      ]
    },
    {
      "id": "delegation-check",
      "name": "EIP-7702 delegation check",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 30,
        "globalPerDay": 1000,
        "maxConcurrent": 4
      },
      "lanes": [
        "wallet-check"
      ],
      "refused": [
        "lists and batches (one delegate, one account, or one account with one authorization per job)",
        "signatures and signed authorization bytes; recovering a signer",
        "which accounts delegate to an address; ranking or comparing delegates",
        "questions such as whether a delegate is safe, a sweeper or a scam, whether funds can be drained, or whether to sign",
        "pending or unmined authorizations",
        "chains other than Ethereum, Base, Arbitrum One and OP Mainnet, and an authorization chainId other than 0 or the chain's id",
        "more than 5 distinct accounts or 10 distinct delegates per payer a day"
      ]
    },
    {
      "id": "multisig-profile",
      "name": "Multisig control profile",
      "price": "0.50",
      "amount": "500000",
      "usesAi": false,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "multisig"
      ],
      "refused": [
        "more than one Safe, lists and batches",
        "rankings and searches such as Safes with threshold 1",
        "who the signers are (signer addresses are never linked to people or holders)",
        "how to compromise, attack or take over a multisig",
        "questions such as whether a Safe can be trusted",
        "pending (queued) transactions",
        "non-Safe multisigs and addresses with no code (refused by the free check)",
        "configuration history on Base (the current configuration is shown)",
        "chains other than Ethereum, OP Mainnet, Arbitrum One and Base"
      ]
    },
    {
      "id": "agent-card-check",
      "name": "ERC-8004 agent dossier",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 50,
        "globalPerDay": 1000,
        "maxConcurrent": 2
      },
      "lanes": [
        "agent-identity"
      ],
      "refused": [
        "listing, searching or ranking agents or reviewers (one agent per job)",
        "contacting an agent's endpoints",
        "questions such as whether an agent is trustworthy, legit or fit to hire",
        "chains other than Ethereum and Base",
        "URL or free-text input (the card is the one the agent registered on chain)",
        "tracing who funds reviewers or agents",
        "an agent id with no agent at the pinned block"
      ]
    },
    {
      "id": "x402-payee-check",
      "name": "Check an x402 payment request before paying",
      "price": "0.20",
      "amount": "200000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 100,
        "globalPerDay": 2000,
        "maxConcurrent": 4
      },
      "lanes": [
        "wallet-check"
      ],
      "refused": [
        "a URL, a resource or a description in any field (nothing is fetched and the seller is never contacted)",
        "more than one payment requirement, or the whole 402 answer",
        "schemes other than exact, and Permit2 payments",
        "networks other than Base (eip155:8453) and Ethereum (eip155:1)",
        "questions such as whether a seller is reliable or will deliver",
        "a payTo (or expected recipient) equal to the payer of the check, and an authorization whose from is the payTo",
        "a signature",
        "unknown transaction hashes, transactions less than 64 blocks below the head, transactions with more than 50 logs, batches and 'all payments to an address'"
      ]
    },
    {
      "id": "token-flow",
      "name": "Token flow report",
      "price": "0.50",
      "amount": "500000",
      "usesAi": false,
      "timeoutSeconds": 180,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "token-flow"
      ],
      "refused": [
        "Base and other chains",
        "ERC-721 and ERC-1155 tokens, EOAs and addresses with no code",
        "more than one token, window or focus address per job (batches)",
        "windows over 200,000 blocks or ending too close to the head",
        "windows with more than 400,000 Transfer events (found during the run; nothing is charged)",
        "ranking tokens, wallets or holders across tokens",
        "following a wallet or a person across tokens or chains, and naming who is behind an address",
        "smart-money, insider, whale and wash-trading labels",
        "USD values, prices, advice and signals"
      ]
    },
    {
      "id": "permissions-map",
      "name": "Contract permissions map",
      "price": "0.50",
      "amount": "500000",
      "usesAi": false,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "contracts"
      ],
      "refused": [
        "more than one address, lists and batches",
        "searches such as find contracts where, rankings and filters",
        "questions such as whether a contract is safe, audited or a rug",
        "which functions are unprotected or callable by anyone",
        "how a contract could be exploited or attacked",
        "the cheapest way to take control of a contract",
        "USD value at stake, balances and value locked",
        "accounts without code and EIP-7702 accounts (refused by the free check)",
        "contracts without verified source, sources that are not Solidity and sources over about 160 KB or 40 files (refused by the free check)",
        "on Base, contracts older than about 14 days (refused by the free check)",
        "chains other than Ethereum, OP Mainnet, Arbitrum One and Base"
      ]
    },
    {
      "id": "mint-contract-check",
      "name": "NFT contract powers and drop settings",
      "price": "1.00",
      "amount": "1000000",
      "usesAi": false,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "mint-contract-check"
      ],
      "refused": [
        "contracts that report neither the ERC-721 nor the ERC-1155 interface, and addresses without code",
        "more than one contract, comparing contracts or scanning a creator's other contracts",
        "questions such as whether the contract can be relied on, who can call a function, code review for bugs",
        "valuation and prices of tokens",
        "chains other than Ethereum and Base"
      ]
    },
    {
      "id": "holder-snapshot",
      "name": "NFT holder snapshot",
      "price": "2.00",
      "amount": "2000000",
      "usesAi": false,
      "timeoutSeconds": 240,
      "limits": {
        "perPayerPerDay": 10,
        "globalPerDay": 80,
        "maxConcurrent": 1
      },
      "lanes": [
        "holder-snapshot"
      ],
      "refused": [
        "chains other than Ethereum and Base",
        "ERC-1155 collections (later), contracts that do not report ERC-721 support, EOAs and addresses with no code",
        "more than one collection per job, lists of token ids and 'find collections with property X'",
        "more than 3,000 token ids (a range or totalSupply()); a range is needed when totalSupply() does not answer",
        "linking addresses to people, ENS names or labels, clustering and enrichment",
        "wallet-level movement tracking and per-holder rankings",
        "statements that an address is eligible for any airdrop or sale; Merkle output (off in v1)",
        "blocks newer than the head minus the chain's pin lag"
      ]
    },
    {
      "id": "airdrop-check",
      "name": "Unknown NFT airdrop check",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 30,
        "globalPerDay": 600,
        "maxConcurrent": 3
      },
      "lanes": [
        "nft-check"
      ],
      "refused": [
        "any verdict or grade, such as whether it is safe to claim or approve",
        "checking a website, a claim link or a signature request (no link is fetched)",
        "wallet history, recipient lists and other contracts of the same deployer",
        "advice on rewording an airdrop or its metadata so points disappear",
        "batches: one token per job",
        "addresses with no code and contracts that report neither ERC-721 nor ERC-1155 (refused by the free check)",
        "a txHash that is not on the chain or emitted no event from the contract (refused by the free check)",
        "collections with more than 100,000 transfer events (refused by the free check)",
        "chains other than Ethereum and Base"
      ]
    },
    {
      "id": "provenance-trail",
      "name": "Token provenance trail",
      "price": "0.50",
      "amount": "500000",
      "usesAi": false,
      "timeoutSeconds": 180,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "provenance-trail"
      ],
      "refused": [
        "chains other than Ethereum and Base",
        "more than one token per job, lists and batches, and wallet-based queries ('all NFTs of wallet X')",
        "ERC-1155 tokens, CryptoPunks, CryptoKitties and other pre-ERC-721 contracts, and contracts that do not answer true to supportsInterface(0x80ac58cd)",
        "tokens without an owner at the block (ownerOf reverts)",
        "tokens with more than 200 transfers (found during the run; nothing is charged, then refused before the 402 for an hour)",
        "Base contracts deployed more than 20,000 blocks before the block",
        "verdicts on theft, fraud, authenticity or wash trading",
        "price or value estimates, and naming who is behind an address"
      ]
    },
    {
      "id": "eip-explainer",
      "name": "Ethereum standard explainer",
      "price": "0.15",
      "amount": "150000",
      "usesAi": true,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "text-ai"
      ],
      "requiresCalibration": true,
      "refused": [
        "anything that is not an EIP or ERC number in ethereum/ERCs or ethereum/EIPs",
        "a commit that is not in the history of master (a fork or an unmerged pull request), a short hash, a branch or a tag",
        "a standard marked moved at the commit sent (send a commit of ethereum/ERCs, or none)",
        "URLs, repositories, paths and free text",
        "implementation code, attack explanations and investment views",
        "languages other than English"
      ]
    },
    {
      "id": "claim-check",
      "name": "Claim check against pinned sources",
      "price": "0.10",
      "amount": "100000",
      "usesAi": true,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "text-ai"
      ],
      "requiresCalibration": true,
      "refused": [
        "claims about private individuals, and allegations about named people",
        "prices, market figures and predictions",
        "medical, legal, financial and other should I questions",
        "on-chain facts and numbers (send them to chain-answer)",
        "finding a source for a conclusion you already hold",
        "links (citation mode is not offered yet)",
        "claims about current or recent elections",
        "secrets such as keys, tokens and seed phrases"
      ]
    },
    {
      "id": "message-explainer",
      "name": "Crypto message explainer",
      "price": "0.15",
      "amount": "150000",
      "usesAi": true,
      "timeoutSeconds": 90,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "message-check"
      ],
      "refused": [
        "texts holding a seed phrase or a private key (refused before payment, not stored)",
        "images, files, screenshots and attachments",
        "verdicts: whether a message is a scam, genuine or fine to act on, and whether to sign, click or reply",
        "who sent a message, and finding, listing or ranking senders",
        "texts over 3,000 characters",
        "help rewording a message so it passes any check",
        "chains other than Ethereum and Base"
      ]
    },
    {
      "id": "signature-preview",
      "name": "Signature request preview",
      "price": "0.10",
      "amount": "100000",
      "usesAi": true,
      "timeoutSeconds": 90,
      "limits": {
        "perPayerPerDay": 50,
        "globalPerDay": 1000,
        "maxConcurrent": 2
      },
      "lanes": [
        "text-ai"
      ],
      "requiresCalibration": true,
      "refused": [
        "raw eth_sign requests and bare 32-byte hashes",
        "Safe transactions (SafeTx typed data; send them to proposal-explainer)",
        "questions and verdicts such as 'should I sign', 'is this a scam' or 'is this site legit'; links and site lookups",
        "more than one request (a list, or typedData and personalSign together)",
        "typed data over 32 KB, personalSign over 2,000 characters, type graphs over the depth and node caps",
        "requests that hold a seed phrase, a private key, an extended private key or a keystore (refused before payment and not stored)",
        "a signature, or a request to make or change one",
        "chains other than Ethereum, Base, Arbitrum One and OP Mainnet"
      ]
    },
    {
      "id": "agent-card-writer",
      "name": "Agent card writer",
      "price": "0.10",
      "amount": "100000",
      "usesAi": true,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "text-ai"
      ],
      "requiresCalibration": true,
      "refused": [
        "inventing capabilities, endpoints, reviews, ratings or trust claims, or any link not in the input",
        "batches: one agent card per job",
        "impersonation: naming a known organisation or person as operator when the card does not show it",
        "cards or notes that promise returns",
        "changing x402Support, supportedTrust, active, registrations, wallet, endpoint or image fields",
        "chains other than Ethereum and Base",
        "pasted secrets (private keys, seed phrases, API tokens)",
        "an agent id with no agent, an empty agentURI, or a card that cannot be fetched or is over 16 KB"
      ]
    },
    {
      "id": "upgrade-check",
      "name": "Upgrade history and diff",
      "price": "1.00",
      "amount": "1000000",
      "usesAi": false,
      "timeoutSeconds": 180,
      "limits": {
        "perPayerPerDay": 10,
        "globalPerDay": 200,
        "maxConcurrent": 2
      },
      "lanes": [
        "upgrade-check"
      ],
      "refused": [
        "more than one proxy, lists and batches",
        "rankings or comparisons of proxies by upgrade risk",
        "questions such as whether an upgrade is safe or whether there is a vulnerability",
        "checks of uninitialized implementations and any initializer state",
        "a storage layout comparison of an upgrade already executed",
        "raw bytecode without an address",
        "diamond proxies (EIP-2535) in this version (refused by the free check)",
        "accounts without code, contracts that are not proxies and proxies with an implementation fixed in their code (refused by the free check)",
        "a newImplementation without code, or one already in place (refused by the free check), or one the paid run finds in the executed history (refused, nothing charged)",
        "chains other than Ethereum, OP Mainnet, Arbitrum One and Base"
      ]
    },
    {
      "id": "sandwich-check",
      "name": "Sandwich check for a past swap (MEV exposure)",
      "price": "0.25",
      "amount": "250000",
      "usesAi": false,
      "timeoutSeconds": 120,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "sandwich-check"
      ],
      "refused": [
        "chains other than Ethereum and Base",
        "pending, dropped or unknown transactions, reverted transactions, and transactions in the last 64 blocks (Ethereum) or 300 blocks (Base)",
        "transactions without a Uniswap v2, v3 or v4 Swap event in a Uniswap pool, and routes through more than 6 Uniswap-schema pools",
        "more than one transaction per job, bulk, batch and block-range requests, and address-based requests",
        "rankings of traders, sandwichers, builders or anyone else",
        "intent, blame, refund or legal wording, trading advice, live signals, predictions and prices"
      ]
    },
    {
      "id": "listing-check",
      "name": "Before you list or buy one NFT (step 1)",
      "price": "0.35",
      "amount": "350000",
      "usesAi": false,
      "timeoutSeconds": 150,
      "limits": {
        "perPayerPerDay": 20,
        "globalPerDay": 300,
        "maxConcurrent": 2
      },
      "lanes": [
        "listing-check"
      ],
      "refused": [
        "buy, sell or hold advice, valuations, and ratings of sellers, buyers or collections",
        "more than one token per job, lists and batches, wallet or collection scans, and listings of tokens",
        "following or fetching links (a marketplace link is parsed to chain, contract and token id only)",
        "simulating a purchase or providing calldata",
        "chains other than Ethereum and Base",
        "contracts without code or without the ERC-721 interface at the block, and tokens without an owner at the block"
      ]
    }
  ]
}
