{
  "name": "Concigliere Books review request",
  "description": "Request a free professional review for a self-published Amazon book by a human or AI-assisted author, or ask about optional sales and distribution outreach on behalf of the author. The same submission the web form at https://concigliere.com/books/request/ sends.",
  "endpoint": "https://concigliere-books-intake-preview.surajsindhia.workers.dev/submit",
  "method": "POST",
  "headers": {
    "Content-Type": "application/json",
    "Origin": "https://concigliere.com"
  },
  "authentication": "none",
  "body": {
    "type": "object",
    "required": [
      "name",
      "email",
      "bookTitle",
      "amazonUrl",
      "request",
      "consent",
      "website"
    ],
    "properties": {
      "name": {
        "type": "string",
        "description": "Contact name"
      },
      "email": {
        "type": "string",
        "format": "email",
        "description": "Reply goes to this address"
      },
      "bookTitle": {
        "type": "string",
        "description": "Title of the self-published book"
      },
      "amazonUrl": {
        "type": "string",
        "format": "uri",
        "description": "Link to the book's Amazon listing"
      },
      "request": {
        "type": "string",
        "enum": [
          "Free book review",
          "Sales and distribution outreach",
          "Both / not sure"
        ]
      },
      "author": {
        "type": "string",
        "description": "Optional author or publisher name"
      },
      "notes": {
        "type": "string",
        "maxLength": 2000,
        "description": "Optional notes"
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "Submitter confirms the rights described on the form page"
      },
      "website": {
        "type": "string",
        "const": "",
        "description": "Spam check; must be empty"
      }
    }
  },
  "limits": {
    "rateLimit": "5 submissions per hour per source",
    "manuscriptUpload": "not available; do not send manuscripts"
  },
  "success": {
    "status": 201,
    "contentType": "application/json",
    "body": {
      "ok": true,
      "message": "Your request was received."
    }
  },
  "errors": {
    "statusRange": "4xx/5xx",
    "body": {
      "error": "message"
    }
  },
  "x-manuscriptUpload": {
    "endpoint": "/.netlify/functions/manuscript-upload",
    "method": "POST",
    "contentType": "multipart/form-data",
    "origin": "https://concigliere.com",
    "fields": "Same fields as this schema, with consent=true as a string, language=en or es, and manuscript as one PDF or ZIP file",
    "maxFileBytes": 4194304,
    "storage": "Private; no public download URL; ZIP stored without extraction",
    "success": {
      "status": 201,
      "body": {
        "ok": true,
        "submissionId": "opaque UUID",
        "manuscriptReceived": true
      }
    },
    "note": "Existing JSON endpoint is metadata only. Send either one multipart request with manuscript or one JSON request without manuscript, not both."
  }
}
