⌘K

RtU Integration

Right-to-Use (RtU) validation checks whether content at a given URL can be used for a specific purpose. It evaluates copyright, licensing, and Terms of Service policies in real-time and returns a clear verdict.

How it works

  1. Submit one or more URLs with a usage purpose
  2. Souma checks each URL against known policies
  3. You receive a verdict: PERMITTED, NOT_PERMITTED, or UNCLEAR
  4. Each result includes a confidence score, plain-language reasoning, and policy references

Basic validation

REST API

curl -X POST https://api.souma.com/v1/validate \
  -H "Authorization: Bearer sk_prod_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "validations": [
      {
        "request_id": "550e8400-e29b-41d4-a716-446655440000",
        "url": "https://example.com/article",
        "purpose": "AI model training"
      }
    ]
  }'

Response

{
  "results": [
    {
      "request_id": "550e8400-e29b-41d4-a716-446655440000",
      "validation_id": "val_abc123",
      "status": "COMPLETED",
      "url": "https://example.com/article",
      "usage_purpose": "AI model training",
      "allowed_for_use": "PERMITTED",
      "confidence_score": 0.92,
      "llm_reasoning": "The site's Terms of Service explicitly permit...",
      "conditions": ["Attribution required"],
      "policy_source_urls": ["https://example.com/terms"],
      "created_at": "2026-03-20T10:30:00Z",
      "completed_at": "2026-03-20T10:30:02Z"
    }
  ]
}

Verdicts

VerdictDescription
PERMITTEDContent can be used for the stated purpose
NOT_PERMITTEDContent cannot be used - policy prohibits it
UNCLEARNo clear policy found - manual review recommended

Batch validation

Submit multiple URLs in a single request:

curl -X POST https://api.souma.com/v1/validate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "validations": [
      {
        "request_id": "id-1",
        "url": "https://example.com/page-1",
        "purpose": "Data analytics"
      },
      {
        "request_id": "id-2",
        "url": "https://example.com/page-2",
        "purpose": "Data analytics"
      }
    ]
  }'

Real-time streaming

For long-running validations, use Server-Sent Events to get results as they complete:

const ids = result.results.map((r) => r.validation_id)
const params = ids.map((id) => `validation_ids=${id}`).join('&')
const eventSource = new EventSource(
  `/api/validate/stream?${params}`
)

eventSource.addEventListener('result', (event) => {
  const updated = JSON.parse(event.data)
  console.log(updated.url, updated.allowed_for_use)
})

eventSource.addEventListener('done', () => {
  eventSource.close()
})

Validation statuses

StatusDescription
PENDINGValidation is still processing
COMPLETEDValidation finished successfully
ERROR_NOT_FOUNDContent not found at URL
ERROR_NO_POLICYNo applicable policy found
ERROR_TIMEOUTValidation timed out
ERROR_NETWORKNetwork error reaching the URL
ERROR_INVALID_URLURL format is invalid

Next steps