Menu

DevelopersREST API

Content API

List content library entries, see where an entry has been used across projects, and assign tags to many entries at once with the AutoRFP.ai REST API.

Content is your approved content library. Use these endpoints to list entries, see where an entry has been used across projects, and add, remove or replace tags on many entries at once.

Reading content needs the content:read scope. Assigning tags needs content:write, which is a write scope.

List content#

get/v1/content

Returns a paginated list of content library entries accessible via the API key.

Required scopecontent:read

Query parameters

  • page[number]integer

    Page number (1-indexed)

    Default:1

    min 1

  • page[size]integer

    Items per page (1-100)

    Default:25

    1 to 100

  • filter[tag]string

    Tag label to filter by

  • filter[updatedAfter]string (date-time)

    ISO 8601 datetime (e.g. "2025-01-01T00:00:00Z")

  • filter[updatedBefore]string (date-time)

    ISO 8601 datetime (e.g. "2025-01-01T00:00:00Z")

Returns

Paginated list of content

  • typeenumrequired

    One of:content

  • idstringrequired
  • attributesobjectrequired
    Show child attributes
    • titlestring | nullrequired

      Content title, question text for QA, section heading for documentation

    • tagsarray of objectsrequired

      Assigned tags: id plus resolved label (label null when the id is not in the current tag vocabulary, an orphan)

      Show child attributes
      • idstringrequired
      • labelstring | nullrequired
    • teamOwnerIdsarray of stringsrequired

      IDs of teams that own this content

    • createdAtstring | nullrequired

      ISO 8601 datetime when the content was created

    • updatedAtstring | nullrequired

      ISO 8601 datetime when the content was last updated

    • reviewedAtstring | nullrequired

      ISO 8601 datetime when the content was last reviewed

    • projectUsageCountnumberrequired

      Number of distinct non-deleted projects that currently reference this content. Live reverse-lookup, not the stored monotonic usageProjectCount.

  • metaobjectrequired
    Show child attributes
    • pageobjectrequired
      Show child attributes
      • numbernumberrequired
      • sizenumberrequired
      • totalItemsnumberrequired
      • totalPagesnumberrequired
  • linksobjectrequired
    Show child attributes
    • selfstringrequired
    • firststringrequired
    • laststring | nullrequired
    • prevstring | nullrequired
    • nextstring | nullrequired

Errors

StatusMeaning
400Invalid query parameters
401Unauthorized
403Insufficient permissions
429Rate limit exceeded
500Internal server error

Request

curl -g "https://api.autorfp.ai/v1/content?page[size]=25" \
  -H "Authorization: Bearer $AUTORFP_API_KEY"

Response

Response

{
  "data": [
    {
      "type": "content",
      "id": "8f14e45f",
      "attributes": {
        "title": "example",
        "tags": [
          {
            "id": "8f14e45f",
            "label": "Security"
          }
        ],
        "teamOwnerIds": [
          "8f14e45f"
        ],
        "createdAt": "2026-03-02T09:30:00.000Z",
        "updatedAt": "2026-03-02T09:30:00.000Z",
        "reviewedAt": "2026-03-02T09:30:00.000Z",
        "projectUsageCount": 1
      }
    }
  ],
  "meta": {
    "page": {
      "number": 1,
      "size": 1,
      "totalItems": 1,
      "totalPages": 1
    }
  },
  "links": {
    "self": "https://api.autorfp.ai/v1/content?page[number]=1&page[size]=25",
    "first": "https://api.autorfp.ai/v1/content?page[number]=1&page[size]=25",
    "last": "https://api.autorfp.ai/v1/content?page[number]=1&page[size]=25",
    "prev": "https://api.autorfp.ai/v1/content?page[number]=1&page[size]=25",
    "next": "https://api.autorfp.ai/v1/content?page[number]=2&page[size]=25"
  }
}

List content usage#

get/v1/content/{id}/usage

Returns a paginated list of usage records showing where a content library entry has been used across projects.

Required scopecontent:read

Path parameters

  • idstringrequired

Query parameters

  • page[number]integer

    Page number (1-indexed)

    Default:1

    min 1

  • page[size]integer

    Items per page (1-100)

    Default:25

    1 to 100

Returns

Paginated list of content usage records

  • typeenumrequired

    One of:content-usage

  • idstringrequired

    Response ID

  • attributesobjectrequired
    Show child attributes
    • projectIdstringrequired

      ID of the project where the content was used

    • requirementIdstringrequired

      ID of the requirement (response ID)

    • usageTypeenumrequired

      How the content was used. 'verbatim' = the response engine used this content as the direct answer source. 'ai_generation' = the response engine used this content as supporting context. 'user_added' = a user explicitly inserted this content into the response while editing.

      One of:verbatimai_generationuser_added

  • metaobjectrequired
    Show child attributes
    • pageobjectrequired
      Show child attributes
      • numbernumberrequired
      • sizenumberrequired
      • totalItemsnumberrequired
      • totalPagesnumberrequired
  • linksobjectrequired
    Show child attributes
    • selfstringrequired
    • firststringrequired
    • laststring | nullrequired
    • prevstring | nullrequired
    • nextstring | nullrequired

Errors

StatusMeaning
400Invalid query parameters
401Unauthorized
403Insufficient permissions
404Content not found
429Rate limit exceeded
500Internal server error

Request

curl -g "https://api.autorfp.ai/v1/content/8f14e45f/usage?page[size]=25" \
  -H "Authorization: Bearer $AUTORFP_API_KEY"

Response

Response

{
  "data": [
    {
      "type": "content-usage",
      "id": "8f14e45f",
      "attributes": {
        "projectId": "8f14e45f",
        "requirementId": "8f14e45f",
        "usageType": "verbatim"
      }
    }
  ],
  "meta": {
    "page": {
      "number": 1,
      "size": 1,
      "totalItems": 1,
      "totalPages": 1
    }
  },
  "links": {
    "self": "https://api.autorfp.ai/v1/content/8f14e45f/usage?page[number]=1&page[size]=25",
    "first": "https://api.autorfp.ai/v1/content/8f14e45f/usage?page[number]=1&page[size]=25",
    "last": "https://api.autorfp.ai/v1/content/8f14e45f/usage?page[number]=1&page[size]=25",
    "prev": "https://api.autorfp.ai/v1/content/8f14e45f/usage?page[number]=1&page[size]=25",
    "next": "https://api.autorfp.ai/v1/content/8f14e45f/usage?page[number]=2&page[size]=25"
  }
}

Bulk assign tags to content#

post/v1/content/tags

Adds, removes, or replaces tags across up to 500 content library items. Requires content:write. Well-formed batches always return 200 with per-item outcomes in successfulContentIds and failures[].

Required scopecontent:write

Request body

  • typeenumrequired

    How to apply the tags: 'add', 'remove', or 'replace'.

    One of:addremovereplace

  • itemsarray of objectsrequired

    Content items to update (max 500 per request, unique contentId per item)

    1 to 500 items

    Show child attributes
    • contentIdstringrequired

      Content embedding id to tag (max 128 chars)

      1 to 128 characters

    • tagIdsarray of stringsrequired

      Tag ids to add/remove/replace on the item (max 100, each max 128 chars)

      max 100 itemseach 1 to 128 characters

Returns

Bulk tag assignment result (partial success possible)

  • typeenumrequired

    One of:content-tag-assignment-result

  • idstringrequired

    Server-generated batch result id (not a content or tag id)

  • attributesobjectrequired
    Show child attributes
    • typeenumrequired

      The operation type from the request

      One of:addremovereplace

    • countsobjectrequired
      Show child attributes
      • totalItemsnumberrequired

        Number of items in the request

      • successfulItemsnumberrequired

        Number of items whose tags were updated

      • unsuccessfulItemsnumberrequired

        Number of items that were not updated

    • successfulContentIdsarray of stringsrequired

      Content ids whose tags were updated

    • failuresarray of objectsrequired

      Per-item outcomes that need attention. A contentId may appear here as tag-not-found while still being in successfulContentIds (valid tags were applied). content-not-found / no-edit-access mean the item was not updated. write-failed means the update did not fully succeed and may be partially applied (e.g. stored but the search index not yet updated); the operations are idempotent, so re-issue the same request to converge. tagIds is set for tag-not-found.

      Show child attributes
      • contentIdstringrequired
      • codeenumrequired

        One of:content-not-foundno-edit-accesstag-not-foundwrite-failed

      • tagIdsarray of strings

Errors

StatusMeaning
400Malformed body, caps exceeded, or duplicate contentId
401Unauthorized
403Insufficient scope
429Rate limit exceeded
500Internal server error

Request

curl -g -X POST "https://api.autorfp.ai/v1/content/tags" \
  -H "Authorization: Bearer $AUTORFP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "add",
  "items": [
    {
      "contentId": "8f14e45f",
      "tagIds": [
        "8f14e45f"
      ]
    }
  ]
}'

Response

Response

{
  "data": {
    "type": "content-tag-assignment-result",
    "id": "8f14e45f",
    "attributes": {
      "type": "add",
      "counts": {
        "totalItems": 1,
        "successfulItems": 1,
        "unsuccessfulItems": 1
      },
      "successfulContentIds": [
        "8f14e45f"
      ],
      "failures": [
        {
          "contentId": "8f14e45f",
          "code": "content-not-found",
          "tagIds": [
            "8f14e45f"
          ]
        }
      ]
    }
  }
}