Skip to content

Migration: Text Content API #556

Description

@Tech-lo

OpenPecha API

Step 1 — Get edition ID

GET /v2/texts/{text_id}/editions?edition_type=critical
Param Type In Required Description
text_id string path Yes OP expression ID
edition_type string query No diplomatic, critical, or all (default)

Response (200) — text_id=5wPLZFpQ6gqRq4WVLz1aE:

[
  {
    "id": "NTC6a2yD6OOwoJtZnUuIu",
    "text_id": "5wPLZFpQ6gqRq4WVLz1aE",
    "type": "critical",
    "source": "www.openpecha.org",
    "bdrc": null,
    "wiki": null,
    "colophon": null,
    "incipit_title": null,
    "alt_incipit_titles": null
  }
]
Code Description
200 Editions retrieved successfully
400 Error with request
404 Resource not found
500 Internal server error

Step 2a — Get segmentation annotations

GET /v2/editions/{edition_id}/annotations?type=segmentation
Param Type In Required Description
edition_id string path Yes Edition (manifestation) ID from Step 1
type array<string> query No Annotation type filter. Options: segmentation, alignment, pagination, bibliography, durchen

Response (200) — edition_id=NTC6a2yD6OOwoJtZnUuIu:

{
  "segmentations": [
    {
      "id": "riqEEIIrGSHXa6xRWb7mH",
      "segments": [
        {
          "id": "gDec9pSWQF9TQSGytfrFZ",
          "lines": [{ "end": 150, "start": 0 }],
          "manifestation_id": "NTC6a2yD6OOwoJtZnUuIu",
          "text_id": "5wPLZFpQ6gqRq4WVLz1aE"
        },
        {
          "id": "9zU8p6Qk5cPlhYV9bbQvP",
          "lines": [{ "end": 421, "start": 150 }],
          "manifestation_id": "NTC6a2yD6OOwoJtZnUuIu",
          "text_id": "5wPLZFpQ6gqRq4WVLz1aE"
        }
      ]
    }
  ]
}

Step 2b — Get durchen annotations

GET /v2/editions/{edition_id}/annotations?type=durchen

Same endpoint, different type param.

Response (200) — edition_id=NTC6a2yD6OOwoJtZnUuIu:

{
  "durchen_notes": [
    {
      "id": "lSTNFAFzMmr3mxQLrSHRu",
      "span": { "end": 149, "start": 145 },
      "text": "མེད། /འོ།/འོ།།"
    },
    {
      "id": "L5V0yrA0h0KHowBgsIHU6",
      "span": { "end": 356, "start": 328 },
      "text": "མེ་རིང་འཚེང་འཇོམས་ཀྱི་ /འོ།/མེ་རི། །"
    }
  ]
}
Code Description
200 Annotations retrieved successfully
404 Resource not found
500 Internal server error

Step 3 — Get base text content

GET /v2/editions/{edition_id}/content
Param Type In Required Description
edition_id string path Yes Edition (manifestation) ID from Step 1
span_start int query No Start character position (use with span_end)
span_end int query No End character position (use with span_start)

Response (200): JSON string (application/json content type). Use segment span offsets from Step 2a to split into segments. Optional span_start/span_end allows fetching a substring instead of the full base text.

Note: Currently returning 500 on dev for all tested edition IDs.

Flow summary: 3 OP calls (editions → annotations → content) + client-side span splitting replaces 1 WeBuddhist POST call.


Replaces WeBuddhist API:

POST /api/v1/texts/{text_id}/details
Param Type In Required Description
text_id string path Yes WeBuddhist internal ID

Request body:

Field Type Description
content_id string Table of contents ID
version_id string Version ID
segment_id string Segment ID
section_id string Section ID
size int Number of segments to return
direction string Pagination direction (next or previous)

Response (200) — text_id=e159959d-2c0c-4f48-b02c-fbdc8c4a98e3:

{
  "text_detail": {
    "id": "e159959d-2c0c-4f48-b02c-fbdc8c4a98e3",
    "pecha_text_id": "XVqq55pnANEKri9536Wa4",
    "title": "The Way of the Bodhisattva",
    "language": "en",
    "group_id": "76060053-0121-40d0-ba34-9c55ea7df2f3",
    "type": "version",
    "summary": "",
    "is_published": false,
    "created_date": "2025-11-27 16:22:29",
    "updated_date": "2025-11-27 16:22:29",
    "published_date": "2025-11-27 16:22:29",
    "published_by": "",
    "categories": ["692876ab70bf66f003b07d6a"],
    "views": 0,
    "likes": [],
    "source_link": "openpecha.org",
    "ranking": null,
    "license": "unknown"
  },
  "content": {
    "id": "13830c91-57ef-4456-bcdc-58ede76c043a",
    "text_id": "e159959d-2c0c-4f48-b02c-fbdc8c4a98e3",
    "sections": [
      {
        "id": "5b23c7c5-d3e5-4f53-bf04-f5f378489b40",
        "title": "1",
        "section_number": 1,
        "parent_id": null,
        "segments": [
          {
            "segment_id": "048576e2-b2bc-4275-9d6c-220ca7357f3c",
            "segment_number": 1,
            "content": "The Way of the Bodhisattva",
            "translation": null
          },
          {
            "segment_id": "13a81958-f751-4baf-833c-96196ded47cf",
            "segment_number": 2,
            "content": "In Sanskrit: Bodhisattvacharyavatara",
            "translation": null
          }
        ],
        "sections": [],
        "created_date": null,
        "updated_date": null,
        "published_date": null
      }
    ]
  },
  "size": 20,
  "pagination_direction": "next",
  "current_segment_position": 1,
  "total_segments": 929
}
Code Description
200 Successful Response
422 Validation Error

Response Mapping

OP flow: GET /v2/texts/{id}/editionsGET /v2/editions/{id}/annotationsGET /v2/editions/{id}/content + client-side span splitting
Replaces: POST /api/v1/texts/{id}/details

WeBuddhist OpenPecha Notes
text_detail.id WeBuddhist-only
text_detail.pecha_text_id editions[].id (Step 1) WeBuddhist stored edition ID
text_detail.title Not returned by editions endpoint. Available from GET /v2/texts/{id} expression
text_detail.language Same as above
text_detail.type editions[].type (Step 1) OP: critical / diplomatic. WeBuddhist: version
text_detail.license Not in editions endpoint. Available from expression or need separate call
text_detail.group_id WeBuddhist-only
text_detail.summary Deprecated
text_detail.is_published To be removed
text_detail.created_date To be removed
text_detail.updated_date To be removed
text_detail.published_date To be removed
text_detail.published_by To be removed
text_detail.categories WeBuddhist-only
text_detail.views WeBuddhist-only
text_detail.likes WeBuddhist-only
text_detail.source_link editions[].source (Step 1) WeBuddhist: "openpecha.org". OP: "www.openpecha.org"
text_detail.ranking To be removed
content.id WeBuddhist-only
content.text_id WeBuddhist-only
content.sections[].id WeBuddhist-only. OP has no section concept
content.sections[].title WeBuddhist-only
content.sections[].section_number WeBuddhist-only
content.sections[].parent_id WeBuddhist-only
content.sections[].segments[].segment_id segmentations[].segments[].id (Step 2a) Direct mapping
content.sections[].segments[].segment_number WeBuddhist-only. OP uses span order instead
content.sections[].segments[].content Base text (Step 3) + segments[].lines[].start/end (Step 2a) OP: client must slice base text using span offsets. WeBuddhist: pre-split content string
content.sections[].segments[].translation WeBuddhist-only (always null in tested data)
size WeBuddhist pagination
pagination_direction WeBuddhist pagination
current_segment_position WeBuddhist pagination
total_segments WeBuddhist pagination. Can be derived from segmentations[].segments array length
editions[].source (Step 1) Source of the edition
editions[].colophon (Step 1) New field
editions[].incipit_title (Step 1) New field
editions[].alt_incipit_titles (Step 1) New field
segments[].manifestation_id (Step 2a) New. Links segment back to edition
segments[].text_id (Step 2a) New. Links segment back to expression
durchen_notes[] (Step 2b) New. Variant readings with span offsets

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions