Skip to main content

Overview

Submit security questionnaires and RFPs to Wolfia for AI-powered autofilling. You can upload a file (spreadsheet, PDF, Word document) or paste in raw text content.

Upload a file

URL: POST https://api.wolfia.com/v1/questionnaire/upload/file Authentication: API key required (see API overview for setup) This endpoint accepts multipart form data.
curl -X POST https://api.wolfia.com/v1/questionnaire/upload/file \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE" \
  -F "[email protected];type=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" \
  -F "company_name=Acme Corp" \
  -F "deal_value=50000" \
  -F "deadline=2025-03-15" \
  -F "instructions=Focus on SOC 2 and ISO 27001 compliance"
You must set the correct MIME type for the file using the ;type= syntax in curl (or the equivalent Content-Type in your HTTP client). Uploads with an incorrect MIME type will fail to process.

Request parameters

ParameterTypeRequiredDescription
filefileYesThe questionnaire file
company_namestringYesCompany that sent the questionnaire
deal_valuedecimalNoAssociated deal value
deadlinedate (YYYY-MM-DD)NoCompletion deadline
instructionsstringNoInstructions to guide AI processing
tag_idsarray of stringsNoTag IDs to categorize the questionnaire
assignee_idsarray of stringsNoUser IDs to assign to
assignee_typesarray of stringsNoType per assignee (USER or GROUP)

Supported file types

ExtensionMIME type
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xlsmapplication/vnd.ms-excel.sheet.macroenabled.12
.xlsapplication/vnd.ms-excel
.csvtext/csv
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.pdfapplication/pdf

Response (200 OK)

{
  "questionnaire_id": "da891171-9293-4218-a74a-c53c55673beb",
  "message": "File 'questionnaire.xlsx' uploaded successfully and queued for processing"
}

Upload text content

URL: POST https://api.wolfia.com/v1/questionnaire/upload/text Authentication: API key required (see API overview for setup) Use this when you have questions as text rather than a file — for example, pasted from an email or extracted from a web form.
curl -X POST https://api.wolfia.com/v1/questionnaire/upload/text \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "text_content": "1. Describe your data encryption standards.\n2. How do you handle incident response?\n3. What certifications do you hold?",
    "company_name": "Acme Corp"
  }'

Request parameters

ParameterTypeRequiredDescription
text_contentstringYesQuestions as text (50 to 200,000 characters)
company_namestringNoCompany that sent the questionnaire
source_typestringNoDefaults to TEXT
deal_valuedecimalNoAssociated deal value
deadlinedate (YYYY-MM-DD)NoCompletion deadline
instructionsstringNoInstructions to guide AI processing
tag_idsarray of stringsNoTag IDs to categorize the questionnaire
assigneesarray of objectsNoEach with id (string) and type (USER or GROUP)

Response (200 OK)

{
  "questionnaire_id": "da891171-9293-4218-a74a-c53c55673beb",
  "message": "Text content uploaded successfully and queued for processing"
}

Integration example

Python: Ingest questionnaires from JIRA

import mimetypes
import os

import requests
from jira import JIRA

WOLFIA_API_KEY = os.environ["WOLFIA_API_KEY"]
BASE_URL = "https://api.wolfia.com/v1"

MIME_TYPES = {
    ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    ".xlsm": "application/vnd.ms-excel.sheet.macroenabled.12",
    ".xls": "application/vnd.ms-excel",
    ".csv": "text/csv",
    ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    ".pdf": "application/pdf",
}


def get_mime_type(filename):
    ext = os.path.splitext(filename)[1].lower()
    return MIME_TYPES.get(ext, mimetypes.guess_type(filename)[0])


def process_questionnaire_tickets():
    jira = JIRA(server=os.environ["JIRA_SERVER"], token_auth=os.environ["JIRA_TOKEN"])
    issues = jira.search_issues('project = SEC AND type = "Security Questionnaire" AND status = "To Do"', maxResults=50)

    for issue in issues:
        company = issue.fields.summary.split(" - ")[0] if " - " in issue.fields.summary else issue.fields.summary

        if issue.fields.attachment:
            att = issue.fields.attachment[0]
            mime_type = get_mime_type(att.filename)
            resp = requests.post(
                f"{BASE_URL}/questionnaire/upload/file",
                headers={"X-API-Key": WOLFIA_API_KEY},
                files={"file": (att.filename, att.get(), mime_type)},
                data={"company_name": company, "instructions": issue.fields.description or ""},
                timeout=60,
            )
        elif issue.fields.description and len(issue.fields.description) >= 50:
            resp = requests.post(
                f"{BASE_URL}/questionnaire/upload/text",
                headers={"X-API-Key": WOLFIA_API_KEY, "Content-Type": "application/json"},
                json={"text_content": issue.fields.description, "company_name": company},
                timeout=30,
            )
        else:
            print(f"Skipping {issue.key}: no attachment or usable description")
            continue

        if resp.status_code == 200:
            qid = resp.json()["questionnaire_id"]
            jira.add_comment(issue, f"Uploaded to Wolfia (ID: {qid})")
            jira.transition_issue(issue, "In Progress")
            print(f"  {issue.key} -> {qid}")
        else:
            print(f"  {issue.key} failed: {resp.text}")


if __name__ == "__main__":
    process_questionnaire_tickets()

Error responses

Status CodeWhat it meansHow to fix
400Unsupported file typeUse a supported format: .xlsx, .xlsm, .xls, .csv, .docx, .pdf
401Invalid or expired API keyVerify your API key
403Insufficient permissionsCheck the API key owner’s role
422Missing required fields or invalid inputCheck required fields. Text must be 50-200,000 characters.
500Internal errorRetry with exponential backoff

Best practices

Use file upload when you have the original document (XLSX, PDF, DOCX). Wolfia preserves the document structure.Use text upload for plain text questions from emails, web forms, or chat messages.
The instructions field shapes how Wolfia fills in answers:
{
  "instructions": "This is a SOC 2 questionnaire. Reference our latest audit report."
}
Include company_name, deal_value, and deadline when available. This metadata appears in the Wolfia dashboard for prioritization.

Getting help

  • Check file types: .xlsx, .xlsm, .xls, .csv, .docx, .pdf
  • Check text length: 50 to 200,000 characters
  • Contact support: Email [email protected]

Next steps