Skip to main content
POST
/
v1
/
policies
/
{id}
/
pdf
/
upload-url
Request a presigned URL to upload a policy PDF
curl --request POST \
  --url https://api.trycomp.ai/v1/policies/{id}/pdf/upload-url \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <api-key>' \
  --data '
{
  "fileName": "acceptable-use-v1.pdf",
  "fileType": "application/pdf"
}
'
{
  "uploadUrl": "https://bucket.s3.us-east-1.amazonaws.com/org_xxx/policies/pol_xxx/...?X-Amz-Signature=...",
  "s3Key": "org_abc/policies/pol_xyz/1735000000-acceptable-use-v1.pdf",
  "expiresIn": 900
}

Documentation Index

Fetch the complete documentation index at: https://www.trycomp.ai/docs/llms.txt

Use this file to discover all available pages before exploring further.

Authorizations

X-API-Key
string
header
required

API key for authentication

Headers

X-Organization-Id
string

Organization ID (required for session auth, optional for API key auth)

Path Parameters

id
string
required

Policy ID

Example:

"pol_abc123def456"

Body

application/json
fileName
string
required

Filename of the PDF (e.g., "policy-v1.pdf"). Non-alphanumeric characters will be replaced with underscores when storing in S3.

Example:

"acceptable-use-v1.pdf"

fileType
string
required

MIME type of the file. Must be "application/pdf" — the presigned URL enforces this at upload time.

Example:

"application/pdf"

versionId
string

Optional version ID to attach the PDF to. Omit to attach the PDF at the policy level (legacy path).

Example:

"pv_abc123def456"

Response

201 - application/json
uploadUrl
string
required

Presigned S3 URL. PUT the raw file bytes to this URL with header Content-Type: application/pdf. No auth headers required — the signature is in the URL.

Example:

"https://bucket.s3.us-east-1.amazonaws.com/org_xxx/policies/pol_xxx/...?X-Amz-Signature=..."

s3Key
string
required

The S3 key the file will land at. Pass this back to the confirm endpoint after a successful upload.

Example:

"org_abc/policies/pol_xyz/1735000000-acceptable-use-v1.pdf"

expiresIn
number
required

Seconds until the presigned URL expires.

Example:

900