Ingest a source document
POST/api/public/v1/aip/sources beta
A paste, an uploaded pdf / docx / md / txt, or audio/*. A paste and an upload answer 201 with the canonical text's char_count; audio answers 202: the aip_sources row exists immediately and job_id is the transcribe job to poll. Wait for the transcript before creating a draft. 413 over 5 MiB, 415 for anything outside the list above.
curl --fail-with-body -X POST 'https://app.openlatch.ai/api/public/v1/aip/sources' \ -H "Authorization: Bearer $OPENLATCH_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"text":"Never push directly to main without a review."}'import jsonimport osimport urllib.request
body = '{"text":"Never push directly to main without a review."}'request = urllib.request.Request( 'https://app.openlatch.ai/api/public/v1/aip/sources', method='POST', data=body.encode(), headers={ 'Authorization': 'Bearer ' + os.environ['OPENLATCH_API_KEY'], 'Content-Type': 'application/json', },)with urllib.request.urlopen(request) as response: text = response.read().decode() print(json.dumps(json.loads(text), indent=2) if text else response.status)#!/usr/bin/env bashset -euo pipefail
curl -sS --fail-with-body -X POST 'https://app.openlatch.ai/api/public/v1/aip/sources' \ -H "Authorization: Bearer $OPENLATCH_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"text":"Never push directly to main without a review."}' | jq .$headers = @{ Authorization = "Bearer $env:OPENLATCH_API_KEY"}$body = '{"text":"Never push directly to main without a review."}'Invoke-RestMethod -Method POST -Uri 'https://app.openlatch.ai/api/public/v1/aip/sources' -Headers $headers -ContentType 'application/json; charset=utf-8' -Body $body | ConvertTo-Json -Depth 20Authorization
Section titled “Authorization”| Role in the organization | This endpoint |
|---|---|
owner | Allowed |
admin | Allowed |
editor | Allowed |
viewer | Not allowed |
A key carries the role its owner holds in the organization. See Authentication.
API key scope: aip:write
Header parameters
Section titled “Header parameters”| Parameter | Type | Description |
|---|---|---|
Idempotency-Key | string or null | Optional. Makes this request safe to retry. Depending on the request, the same key with the same request either joins the job the first one queued (409 JOB_ALREADY_EXISTS, the job id in details) or replays the first answer (Idempotent-Replayed: true; 409 IDEMPOTENCY_IN_PROGRESS while it runs). The same key with another request is 422 IDEMPOTENCY_KEY_REUSED. |
Request body
Section titled “Request body”| Field | Type | Description |
|---|---|---|
text | string | Required. A pasted policy document, verbatim. |
Response
Section titled “Response”- 201 Created — the call succeeded.
- 202 Accepted — the call succeeded.
- 400 Bad Request —
BAD_REQUEST - 401 Unauthorized —
UNAUTHORIZED - 402 Payment Required —
license_expired - 403 Forbidden —
FEATURE_DISABLED,FORBIDDEN,INSUFFICIENT_SCOPE - 409 Conflict —
IDEMPOTENCY_IN_PROGRESS,JOB_ALREADY_EXISTS - 413 Content Too Large —
PAYLOAD_TOO_LARGE - 415 Unsupported Media Type —
UNSUPPORTED_MEDIA_TYPE - 422 Unprocessable Content —
IDEMPOTENCY_KEY_REUSED,INVALID_BODY,INVALID_ID,INVALID_MULTIPART,UNREADABLE_SOURCE,VALIDATION_ERROR - 429 Too Many Requests —
TOO_MANY_REQUESTS - 500 Internal Server Error —
INTERNAL_SERVER_ERROR,tenant_isolation_violation - 503 Service Unavailable —
FEATURE_STATE_UNAVAILABLE,SERVICE_UNAVAILABLE
Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
data | object | Required. `201 for a paste or an upload` — the text is already canonical. |
data.char_count | integer | Required. |
data.id | string | Required. |
data.kind | string | Required. |
data.page_count | integer or null |
Example response
Section titled “Example response”{ "data": { "char_count": 3, "id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "kind": "string", "page_count": 3 }}