{
  "openapi": "3.1.0",
  "info": {
    "contact": {
      "name": "Solvecha",
      "url": "https://solvecha.com/contact"
    },
    "description": "Create a job with a picture of a captcha, then poll for the answer. Authenticate with your API key. Documentation: https://solvecha.com/docs",
    "summary": "Captcha recognition API, compatible with the NopeCHA recognition API.",
    "termsOfService": "https://solvecha.com/legal/terms",
    "title": "Solvecha API",
    "version": "1.0.0"
  },
  "servers": [
    {
      "description": "Production",
      "url": "https://api.solvecha.com"
    }
  ],
  "tags": [
    {
      "description": "Create jobs and fetch answers.",
      "name": "Recognition"
    },
    {
      "description": "Status of your key.",
      "name": "Account"
    },
    {
      "description": "Optional verdicts that help improve the models.",
      "name": "Feedback"
    },
    {
      "description": "Paths of the first NopeCHA API. Errors are answered with HTTP 200.",
      "name": "Legacy"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "deprecated": true,
        "description": "The poll request of the first NopeCHA API. It returns the answer of a job that you created on the root path or on a /v1/recognition/... path. Errors are answered with HTTP status 200: while the job is not ready you get {\"error\": 14, \"message\": \"Incomplete job\"}.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/legacy-get-job-result"
        },
        "operationId": "legacyGetJobResult",
        "parameters": [
          {
            "description": "The job id.",
            "in": "query",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Your API key, if you do not send it in the Authorization header.",
            "in": "query",
            "name": "key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    false,
                    true,
                    false,
                    true,
                    true,
                    false,
                    false,
                    false,
                    false
                  ]
                },
                "schema": {
                  "properties": {
                    "data": {}
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job is ready. An error also has HTTP status 200: the body then has an `error` field (see the LegacyError schema)."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Get the answer of a job (legacy path)",
        "tags": [
          "Legacy"
        ]
      },
      "post": {
        "deprecated": true,
        "description": "The root path from the first NopeCHA API. It exists so that older clients keep working. New code should use the /v1/recognition/... paths. On this path the captcha type is a field of the body, and errors are answered with HTTP status 200: look at the error field.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/legacy-create-job"
        },
        "operationId": "legacyCreateJob",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "type": "recaptcha",
                "task": "Select all images with buses",
                "grid": "3x3",
                "image_data": [
                  "BASE64_IMAGE"
                ]
              },
              "schema": {
                "properties": {
                  "grid": {
                    "description": "reCAPTCHA only.",
                    "enum": [
                      "3x3",
                      "4x4",
                      "1x1"
                    ],
                    "type": "string"
                  },
                  "image_data": {
                    "description": "Base64 pictures. See the page of the captcha type.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text. See the page of the captcha type.",
                    "type": "string"
                  },
                  "type": {
                    "description": "The captcha type.",
                    "enum": [
                      "recaptcha",
                      "textcaptcha",
                      "geetest",
                      "funcaptcha",
                      "funcaptcha_match"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "image_data"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "grid": {
                    "description": "reCAPTCHA only.",
                    "enum": [
                      "3x3",
                      "4x4",
                      "1x1"
                    ],
                    "type": "string"
                  },
                  "image_data": {
                    "description": "Base64 pictures. See the page of the captcha type.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text. See the page of the captcha type.",
                    "type": "string"
                  },
                  "type": {
                    "description": "The captcha type.",
                    "enum": [
                      "recaptcha",
                      "textcaptcha",
                      "geetest",
                      "funcaptcha",
                      "funcaptcha_match"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "image_data"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "1234567"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The job id.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job was created. `data` is the job id. An error also has HTTP status 200: the body then has an `error` field (see the LegacyError schema)."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Create a job (legacy path)",
        "tags": [
          "Legacy"
        ]
      }
    },
    "/status": {
      "get": {
        "deprecated": true,
        "description": "Same answer as Get the status of your key, on the path of the first NopeCHA API. Errors are answered with HTTP status 200.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/legacy-get-status"
        },
        "operationId": "legacyGetStatus",
        "parameters": [
          {
            "description": "Your API key, if you do not send it in the Authorization header.",
            "in": "query",
            "name": "key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "plan": "Basic",
                  "status": "Active",
                  "credit": 19873,
                  "quota": 20000,
                  "duration": 86400,
                  "lastreset": 1760486400,
                  "ttl": 41200,
                  "subscribed": 0,
                  "current_period_start": 1760000000,
                  "current_period_end": 1762600000
                },
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "The state of your key. An error also has HTTP status 200: the body then has an `error` field (see the LegacyError schema)."
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Get the status of your key (legacy path)",
        "tags": [
          "Legacy"
        ]
      }
    },
    "/v1/feedback": {
      "post": {
        "description": "After you submit our answer to Google, you can tell us whether Google accepted it. This helps us improve the models. It is optional and costs no quota. The browser extension does this for you.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/send-feedback"
        },
        "operationId": "sendFeedback",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "job_id": "1234567",
                "verdict": "accepted",
                "grid": "3x3",
                "round_index": 0
              },
              "schema": {
                "properties": {
                  "grid": {
                    "description": "The grid size of the challenge.",
                    "enum": [
                      "1x1",
                      "3x3",
                      "4x4"
                    ],
                    "type": "string"
                  },
                  "job_id": {
                    "description": "The job id from the create response. It must be a reCAPTCHA job of your key.",
                    "type": "string"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "round_index": {
                    "description": "The number of the round in the challenge, from 0 to 64.",
                    "maximum": 64,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "verdict": {
                    "description": "Whether Google accepted the answer.",
                    "enum": [
                      "accepted",
                      "rejected"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "job_id",
                  "verdict",
                  "grid"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "grid": {
                    "description": "The grid size of the challenge.",
                    "enum": [
                      "1x1",
                      "3x3",
                      "4x4"
                    ],
                    "type": "string"
                  },
                  "job_id": {
                    "description": "The job id from the create response. It must be a reCAPTCHA job of your key.",
                    "type": "string"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "round_index": {
                    "description": "The number of the round in the challenge, from 0 to 64.",
                    "maximum": 64,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "verdict": {
                    "description": "Whether Google accepted the answer.",
                    "enum": [
                      "accepted",
                      "rejected"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "job_id",
                  "verdict",
                  "grid"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "ok"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "enum": [
                        "ok"
                      ],
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The verdict is stored. The first verdict per job counts. A repeat changes nothing."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Send feedback",
        "tags": [
          "Feedback"
        ]
      }
    },
    "/v1/recognition/funcaptcha": {
      "post": {
        "description": "Creates a job for a FunCAPTCHA puzzle where you pick the tile that shows the asked object. Send the task text and one picture with the 3x2 grid of tiles.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/create-funcaptcha-job"
        },
        "operationId": "createFuncaptchaJob",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "task": "Pick the sheep",
                "image_data": [
                  "BASE64_GRID"
                ]
              },
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "One base64 picture with the grid of six tiles (3x2).",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text, for example Pick the sheep.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "image_data"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "One base64 picture with the grid of six tiles (3x2).",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text, for example Pick the sheep.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "image_data"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "1234567"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The job id.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job was created. `data` is the job id."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "403": {
            "$ref": "#/components/responses/Error16"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Create a FunCAPTCHA tile job",
        "tags": [
          "Recognition"
        ]
      }
    },
    "/v1/recognition/funcaptcha_match": {
      "post": {
        "description": "Creates a job for a game-style FunCAPTCHA where one picture must match a reference, for example a count. Send the task text and one uncropped game image.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/create-funcaptcha-match-job"
        },
        "operationId": "createFuncaptchaMatchJob",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "task": "Match the number of rocks with the number on the left",
                "image_data": [
                  "BASE64_IMAGE"
                ]
              },
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "One uncropped base64 picture of the game.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text, for example Match the number of rocks with the number on the left.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "image_data"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "One uncropped base64 picture of the game.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text, for example Match the number of rocks with the number on the left.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "image_data"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "1234567"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The job id.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job was created. `data` is the job id."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "403": {
            "$ref": "#/components/responses/Error16"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Create a FunCAPTCHA match job",
        "tags": [
          "Recognition"
        ]
      }
    },
    "/v1/recognition/geetest": {
      "post": {
        "description": "Creates a job for a GeeTest slider. Send the task text and either one picture of the whole challenge or two pictures: the background first, then the transparent puzzle piece.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/create-geetest-job"
        },
        "operationId": "createGeetestJob",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "task": "slide",
                "image_data": [
                  "BASE64_BACKGROUND",
                  "BASE64_PIECE"
                ]
              },
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "One base64 screenshot of the complete challenge, or two base64 pictures in this order: background, then puzzle piece.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text of the challenge, for example slide.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "image_data"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "One base64 screenshot of the complete challenge, or two base64 pictures in this order: background, then puzzle piece.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text of the challenge, for example slide.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "image_data"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "1234567"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The job id.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job was created. `data` is the job id."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "403": {
            "$ref": "#/components/responses/Error16"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Create a GeeTest job",
        "tags": [
          "Recognition"
        ]
      }
    },
    "/v1/recognition/recaptcha": {
      "post": {
        "description": "Creates a job for a reCAPTCHA image challenge. For 3x3 and 4x4 grids send one picture of the whole grid. For 1x1 (the single tiles that appear after a click) send 1 to 9 tile pictures. The answer is not in this response: fetch it with the job id.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/create-recaptcha-job"
        },
        "operationId": "createRecaptchaJob",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "task": "Select all images with buses",
                "grid": "3x3",
                "image_data": [
                  "BASE64_IMAGE"
                ]
              },
              "schema": {
                "properties": {
                  "grid": {
                    "description": "The grid size of the challenge.",
                    "enum": [
                      "3x3",
                      "4x4",
                      "1x1"
                    ],
                    "type": "string"
                  },
                  "image_data": {
                    "description": "Base64 pictures without a data: prefix. One picture of the whole grid for 3x3 and 4x4. One to nine tile pictures for 1x1. In a form body use image_data[0], image_data[1] and so on.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text that the user reads, for example Select all images with buses. Send the full sentence. Up to 2,048 characters.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "grid",
                  "image_data"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "grid": {
                    "description": "The grid size of the challenge.",
                    "enum": [
                      "3x3",
                      "4x4",
                      "1x1"
                    ],
                    "type": "string"
                  },
                  "image_data": {
                    "description": "Base64 pictures without a data: prefix. One picture of the whole grid for 3x3 and 4x4. One to nine tile pictures for 1x1. In a form body use image_data[0], image_data[1] and so on.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  },
                  "task": {
                    "description": "The instruction text that the user reads, for example Select all images with buses. Send the full sentence. Up to 2,048 characters.",
                    "type": "string"
                  }
                },
                "required": [
                  "task",
                  "grid",
                  "image_data"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "1234567"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The job id.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job was created. `data` is the job id."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "403": {
            "$ref": "#/components/responses/Error16"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Create a reCAPTCHA job",
        "tags": [
          "Recognition"
        ]
      }
    },
    "/v1/recognition/textcaptcha": {
      "post": {
        "description": "Creates a job for a text captcha: one picture with distorted letters and digits. The answer is the text.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/create-text-captcha-job"
        },
        "operationId": "createTextCaptchaJob",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "image_data": [
                  "BASE64_IMAGE"
                ]
              },
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "Exactly one base64 picture. No task text is needed.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  }
                },
                "required": [
                  "image_data"
                ],
                "type": "object"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "image_data": {
                    "description": "Exactly one base64 picture. No task text is needed.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "key": {
                    "description": "Your API key, if you do not send it in the Authorization header or the query string.",
                    "type": "string"
                  }
                },
                "required": [
                  "image_data"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": "1234567"
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The job id.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job was created. `data` is the job id."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "403": {
            "$ref": "#/components/responses/Error16"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Create a text captcha job",
        "tags": [
          "Recognition"
        ]
      }
    },
    "/v1/recognition/{type}": {
      "get": {
        "description": "Returns the answer of a job that you created before. Use the same captcha type in the path as when you created the job. While the job is not ready, the response is error 14 (HTTP 409): wait one second and ask again.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/get-job-result"
        },
        "operationId": "getJobResult",
        "parameters": [
          {
            "description": "The captcha type of the job.",
            "in": "path",
            "name": "type",
            "required": true,
            "schema": {
              "enum": [
                "recaptcha",
                "textcaptcha",
                "geetest",
                "funcaptcha",
                "funcaptcha_match"
              ],
              "type": "string"
            }
          },
          {
            "description": "The job id from the create response. Up to 64 characters.",
            "in": "query",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Your API key, if you do not send it in the Authorization header.",
            "in": "query",
            "name": "key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    false,
                    true,
                    false,
                    true,
                    true,
                    false,
                    false,
                    false,
                    false
                  ]
                },
                "schema": {
                  "properties": {
                    "data": {
                      "description": "The answer. An array of booleans (reCAPTCHA, FunCAPTCHA), an array with one string (text captcha) or an object with `x` (GeeTest).",
                      "oneOf": [
                        {
                          "items": {
                            "type": "boolean"
                          },
                          "type": "array"
                        },
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "properties": {
                            "x": {
                              "type": "number"
                            }
                          },
                          "type": "object"
                        }
                      ]
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "The job is ready. The shape of `data` depends on the captcha type. Each type page shows it."
          },
          "400": {
            "$ref": "#/components/responses/Error10"
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "409": {
            "$ref": "#/components/responses/Error14"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Get the answer of a job",
        "tags": [
          "Recognition"
        ]
      }
    },
    "/v1/status": {
      "get": {
        "description": "Returns the plan of your key and how much of today's quota is left. The request costs no quota.",
        "externalDocs": {
          "description": "Documentation page",
          "url": "https://solvecha.com/docs/api/get-status"
        },
        "operationId": "getStatus",
        "parameters": [
          {
            "description": "Your API key, if you do not send it in the Authorization header.",
            "in": "query",
            "name": "key",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "plan": "Basic",
                  "status": "Active",
                  "credit": 19873,
                  "quota": 20000,
                  "duration": 86400,
                  "lastreset": 1760486400,
                  "ttl": 41200,
                  "subscribed": 0,
                  "current_period_start": 1760000000,
                  "current_period_end": 1762600000
                },
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "The state of your key."
          },
          "401": {
            "$ref": "#/components/responses/Error15"
          },
          "429": {
            "$ref": "#/components/responses/Error11"
          },
          "500": {
            "$ref": "#/components/responses/Error9"
          }
        },
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyQuery": []
          }
        ],
        "summary": "Get the status of your key",
        "tags": [
          "Account"
        ]
      }
    }
  },
  "components": {
    "responses": {
      "Error10": {
        "content": {
          "application/json": {
            "example": {
              "code": 10,
              "error": 10,
              "message": "Invalid request",
              "type": null
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error 10, Invalid request. The request cannot be used: the body is not JSON or url-encoded form data, it is larger than 4.5 MB, a field or the number of images is wrong, or the job id is unknown or belongs to another captcha type."
      },
      "Error11": {
        "content": {
          "application/json": {
            "example": {
              "code": 11,
              "error": 11,
              "message": "Rate limit reached",
              "type": null
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error 11, Rate limit reached. Your key sent more requests per minute than its plan allows, or too many requests with a wrong key came from your address."
      },
      "Error14": {
        "content": {
          "application/json": {
            "example": {
              "code": 14,
              "error": 14,
              "message": "Incomplete job",
              "type": null
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error 14, Incomplete job. The job exists, but the answer is not ready. Poll again in one second."
      },
      "Error15": {
        "content": {
          "application/json": {
            "example": {
              "code": 15,
              "error": 15,
              "message": "Invalid key",
              "type": null
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error 15, Invalid key. The key is missing, has the wrong shape, or is unknown."
      },
      "Error16": {
        "content": {
          "application/json": {
            "example": {
              "code": 16,
              "error": 16,
              "message": "Out of credit",
              "type": null
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error 16, Out of credit. Your key has no active plan, the plan has expired, or today's quota of successful solves is used (jobs that are still open count as well)."
      },
      "Error9": {
        "content": {
          "application/json": {
            "example": {
              "code": 9,
              "error": 9,
              "message": "Unknown error",
              "type": null
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "description": "Error 9, Unknown error. Something went wrong on our side, or the recognition engine could not be reached. Retry after a few seconds."
      }
    },
    "schemas": {
      "Error": {
        "properties": {
          "code": {
            "description": "The same code (on /v1 paths).",
            "type": "integer"
          },
          "error": {
            "description": "The error code.",
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "type": {
            "type": "null"
          }
        },
        "required": [
          "error",
          "message"
        ],
        "type": "object"
      },
      "LegacyError": {
        "properties": {
          "error": {
            "description": "The error code.",
            "type": "integer"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "message"
        ],
        "type": "object"
      },
      "Status": {
        "properties": {
          "credit": {
            "description": "Successful solves left in the current daily window.",
            "type": "integer"
          },
          "current_period_end": {
            "description": "Unix time when the plan period ends.",
            "type": "integer"
          },
          "current_period_start": {
            "description": "Unix time when the plan period began.",
            "type": "integer"
          },
          "duration": {
            "description": "Length of the quota window in seconds.",
            "type": "integer"
          },
          "lastreset": {
            "description": "Unix time of the last quota reset (00:00 UTC).",
            "type": "integer"
          },
          "plan": {
            "description": "Name of the plan, or `No plan`.",
            "type": "string"
          },
          "quota": {
            "description": "Successful solves per day for the plan.",
            "type": "integer"
          },
          "status": {
            "enum": [
              "Active",
              "Expired",
              "Inactive"
            ],
            "type": "string"
          },
          "subscribed": {
            "description": "Always 0. Kept for compatibility with NopeCHA.",
            "type": "integer"
          },
          "ttl": {
            "description": "Seconds until the next reset.",
            "type": "integer"
          }
        },
        "required": [
          "plan",
          "status",
          "credit",
          "quota",
          "duration",
          "lastreset",
          "ttl",
          "subscribed",
          "current_period_start",
          "current_period_end"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "apiKeyQuery": {
        "description": "Your API key as a query parameter.",
        "in": "query",
        "name": "key",
        "type": "apiKey"
      },
      "bearerAuth": {
        "description": "Your API key, for example `Authorization: Bearer slv_...`. `Authorization: Basic \u003ckey\u003e` is accepted as well. The key can also be sent as the `key` field of a body.",
        "scheme": "bearer",
        "type": "http"
      }
    }
  }
}
