Skip to main content

Overview

Content tags let you categorize questionnaires and knowledge base content. Use the tags API to retrieve available tags — for example, to populate a dropdown when uploading a questionnaire via the API. Tags have three statuses:
StatusMeaning
ACTIVEApproved and available for use
DRAFTAI-suggested, pending admin approval
REJECTEDRejected by an admin, hidden from default queries

List tags

URL: GET https://api.wolfia.com/v1/tags/ Authentication: API key required (see API overview) Returns all content tags for your organization, ordered alphabetically by name.

Request

curl -X GET 'https://api.wolfia.com/v1/tags/' \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"

Query parameters

ParameterTypeRequiredDefaultDescription
statusstringNoACTIVE + DRAFTFilter by status: ACTIVE, DRAFT, or REJECTED
When no status filter is provided, the endpoint returns both ACTIVE and DRAFT tags. To retrieve only approved tags, pass ?status=ACTIVE.

Response (200 OK)

[
  {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "SOC 2",
    "description": "SOC 2 compliance questionnaires",
    "is_ai_generated": false,
    "status": "ACTIVE"
  },
  {
    "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "name": "ISO 27001",
    "description": "ISO 27001 security questionnaires",
    "is_ai_generated": true,
    "status": "DRAFT"
  }
]

Response fields

FieldTypeDescription
idstring (UUID)Unique tag identifier — use this as tag_ids when uploading questionnaires
namestringDisplay name of the tag
descriptionstringDescription of the tag’s purpose
is_ai_generatedbooleantrue if Wolfia’s AI suggested this tag
statusstringACTIVE, DRAFT, or REJECTED

Integration example

Python: Tag a questionnaire on upload

import os

import requests

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


def upload_with_tags(file_path, company_name, tag_names):
    """Upload a questionnaire with matching tags applied."""
    headers = {'X-API-Key': API_KEY}

    # Fetch available tags
    tags_resp = requests.get(
        f'{BASE_URL}/tags/',
        headers=headers,
        params={'status': 'ACTIVE'},
        timeout=10,
    )
    tags_resp.raise_for_status()
    all_tags = tags_resp.json()

    # Match requested tag names (case-insensitive)
    tag_ids = [
        t['id'] for t in all_tags
        if t['name'].lower() in [n.lower() for n in tag_names]
    ]

    # Upload the questionnaire with tags
    with open(file_path, 'rb') as f:
        upload_resp = requests.post(
            f'{BASE_URL}/questionnaire/upload/file',
            headers=headers,
            files={'file': (os.path.basename(file_path), f, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')},
            data={
                'company_name': company_name,
                'tag_ids': tag_ids,
            },
            timeout=60,
        )
    upload_resp.raise_for_status()
    return upload_resp.json()


if __name__ == '__main__':
    result = upload_with_tags('questionnaire.xlsx', 'Acme Corp', ['SOC 2', 'ISO 27001'])
    print(f"Uploaded: {result['questionnaire_id']}")

Error responses

StatusMeaningSolution
401Invalid API keyVerify your API key is correct
403Insufficient permissionsCheck the API key owner’s role
422Invalid parametersEnsure status is one of ACTIVE, DRAFT, REJECTED
500Server errorRetry with exponential backoff

Next steps