API Reference

Output Formats

Export ZineCore2 data in 7 different formats via content negotiation

The ZineCore2 API supports 7 output formats via HTTP content negotiation. Use the Accept header to specify your preferred format.

Supported Formats

FormatAccept HeaderUse CaseEndpoints
JSONapplication/jsonDefault, API clientsAll
JSON-LDapplication/ld+jsonLinked DataAll
CSVtext/csvSpreadsheets, bulk exportLists only
DC XMLapplication/xmlDublin Core XMLAll
RDF/Turtletext/turtleSemantic webAll
BibTeXapplication/x-bibtexCitation managementZines only
MARCXMLapplication/marcxml+xmlLibrary systemsZines only

Default: If no Accept header is provided, JSON is returned.


JSON (Default)

Accept header: application/json

Standard JSON format used by the API.

Example Request

curl http://localhost:8000/api/zines/zine_mutate_3_1st/
# or explicitly:
curl -H "Accept: application/json" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Example Response

{
  "zine_id": "zine_mutate_3_1st",
  "title": "Mutate Zine #3: Abortion Stories",
  "series_title": ["Mutate Zine"],
  "issue_designation": "#3",
  "creator": [
    {
      "agent_id": "agent_judith_arcana",
      "display_name": "Judith Arcana",
      "kind": "Person"
    }
  ],
  "subject": [
    {
      "code": "feminism",
      "label": "Feminism",
      "uri": "https://zinecore.org/v2/subjects#feminism"
    }
  ],
  "genre": [
    {
      "code": "personal-zine",
      "label": "Personal Zine",
      "uri": "https://zinecore.org/v2/genres#personal-zine"
    }
  ],
  "date": ["2024"],
  "language": ["en"],
  "rights": ["cc-by-4.0"],
  "abstract": "Personal narratives and essays about reproductive rights.",
  "created_at": "2024-02-25T10:30:00Z",
  "updated_at": "2024-02-25T10:30:00Z"
}

Use for:

  • API clients
  • Web applications
  • Mobile apps
  • Scripting

JSON-LD (Linked Data)

Accept header: application/ld+json

JSON-LD format with full semantic context.

Example Request

curl -H "Accept: application/ld+json" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Example Response

{
  "@context": "https://zinecore.org/v2/contexts/zine.jsonld",
  "@type": "CreativeWork",
  "@id": "https://zinecore.org/v2/zines/zine_mutate_3_1st",
  "dcterms:title": "Mutate Zine #3: Abortion Stories",
  "dcterms:isPartOf": ["Mutate Zine"],
  "zine:issueDesignation": "#3",
  "dcterms:creator": [
    {
      "@id": "https://zinecore.org/v2/agents/agent_judith_arcana",
      "foaf:name": "Judith Arcana"
    }
  ],
  "dcterms:subject": [
    {
      "@id": "https://zinecore.org/v2/subjects#feminism",
      "skos:prefLabel": "Feminism"
    }
  ],
  "dcterms:type": [
    {
      "@id": "https://zinecore.org/v2/genres#personal-zine",
      "skos:prefLabel": "Personal Zine"
    }
  ],
  "dcterms:date": ["2024"],
  "dcterms:language": ["en"],
  "dcterms:rights": ["cc-by-4.0"],
  "dcterms:description": "Personal narratives and essays about reproductive rights."
}

Features:

  • Full Dublin Core property names
  • URIs for all entities
  • @context links to JSON-LD context
  • Compatible with semantic web tools

Use for:

  • Linked Data applications
  • Semantic web integration
  • RDF conversion
  • Knowledge graphs

CSV (Spreadsheets)

Accept header: text/csv

Comma-separated values format for spreadsheets.

Example Request

curl -H "Accept: text/csv" \
  http://localhost:8000/api/zines/ > zines.csv

Example Response

zine_id,title,series_title,issue_designation,creator,subject,genre,date,language,rights,abstract,created_at
zine_mutate_3_1st,"Mutate Zine #3: Abortion Stories","Mutate Zine",#3,"agent_judith_arcana","feminism|reproductive-rights","personal-zine","2024","en","cc-by-4.0","Personal narratives and essays about reproductive rights.",2024-02-25T10:30:00Z
zine_feminist_killjoy_1,"Feminist Killjoy #1","Feminist Killjoy",#1,"agent_sara_ahmed","feminism","personal-zine","2024","en","cc-by-4.0","Reflections on feminist theory and activism.",2024-02-24T14:00:00Z

Array fields: Separated by | (pipe character)

Use for:

  • Excel, Google Sheets, LibreOffice Calc
  • Bulk data export
  • Data analysis
  • Archival exports

Note: Only available for list endpoints (not individual records).


Dublin Core XML

Accept header: application/xml

XML format using Dublin Core elements.

Example Request

curl -H "Accept: application/xml" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Example Response

<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:dcterms="http://purl.org/dc/terms/"
        xmlns:zine="https://zinecore.org/v2/zine#">
  <dcterms:identifier>zine_mutate_3_1st</dcterms:identifier>
  <dcterms:title>Mutate Zine #3: Abortion Stories</dcterms:title>
  <dcterms:isPartOf>Mutate Zine</dcterms:isPartOf>
  <zine:issueDesignation>#3</zine:issueDesignation>
  <dcterms:creator>Judith Arcana</dcterms:creator>
  <dcterms:subject>feminism</dcterms:subject>
  <dcterms:subject>reproductive-rights</dcterms:subject>
  <dcterms:type>personal-zine</dcterms:type>
  <dcterms:date>2024</dcterms:date>
  <dcterms:language>en</dcterms:language>
  <dcterms:rights>cc-by-4.0</dcterms:rights>
  <dcterms:description>Personal narratives and essays about reproductive rights.</dcterms:description>
</record>

Features:

  • Standard Dublin Core elements
  • XML namespaces for dcterms and zine properties
  • Repeatable elements represented as multiple XML elements

Use for:

  • OAI-PMH harvesting
  • XML-based workflows
  • Legacy system integration
  • Standards-compliant metadata

RDF/Turtle

Accept header: text/turtle

Turtle (Terse RDF Triple Language) format.

Example Request

curl -H "Accept: text/turtle" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Example Response

@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix zine: <https://zinecore.org/v2/zine#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

<https://zinecore.org/v2/zines/zine_mutate_3_1st>
  a dcterms:BibliographicResource ;
  dcterms:identifier "zine_mutate_3_1st" ;
  dcterms:title "Mutate Zine #3: Abortion Stories" ;
  dcterms:isPartOf "Mutate Zine" ;
  zine:issueDesignation "#3" ;
  dcterms:creator <https://zinecore.org/v2/agents/agent_judith_arcana> ;
  dcterms:subject <https://zinecore.org/v2/subjects#feminism> ,
                  <https://zinecore.org/v2/subjects#reproductive-rights> ;
  dcterms:type <https://zinecore.org/v2/genres#personal-zine> ;
  dcterms:date "2024" ;
  dcterms:language "en" ;
  dcterms:rights "cc-by-4.0" ;
  dcterms:description "Personal narratives and essays about reproductive rights." .

<https://zinecore.org/v2/agents/agent_judith_arcana>
  foaf:name "Judith Arcana" .

<https://zinecore.org/v2/subjects#feminism>
  skos:prefLabel "Feminism" .

Features:

  • RDF triples in Turtle syntax
  • All entities as URIs
  • Linked relationships

Use for:

  • RDF databases (triple stores)
  • SPARQL queries
  • Semantic web applications
  • Linked Open Data

BibTeX (Citation Management)

Accept header: application/x-bibtex

BibTeX format for citation management tools.

Example Request

curl -H "Accept: application/x-bibtex" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Example Response

@misc{zine_mutate_3_1st,
  title = {Mutate Zine \#3: Abortion Stories},
  author = {Arcana, Judith},
  year = {2024},
  note = {Mutate Zine, \#3},
  abstract = {Personal narratives and essays about reproductive rights.},
  keywords = {feminism, reproductive-rights},
  language = {en}
}

Use for:

  • LaTeX/BibTeX documents
  • Reference managers (Zotero, Mendeley, etc.)
  • Academic citations
  • Bibliography generation

Available for: Zines only (not agents, holdings, repositories)


MARCXML (Library Systems)

Accept header: application/marcxml+xml

MARCXML format for library catalogs.

Example Request

curl -H "Accept: application/marcxml+xml" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Example Response

<?xml version="1.0" encoding="UTF-8"?>
<record xmlns="http://www.loc.gov/MARC21/slim">
  <leader>00000nam a2200000 a 4500</leader>
  <controlfield tag="008">240225s2024    xxu                 eng  </controlfield>
  <datafield tag="245" ind1="0" ind2="0">
    <subfield code="a">Mutate Zine #3:</subfield>
    <subfield code="b">Abortion Stories</subfield>
  </datafield>
  <datafield tag="490" ind1="0" ind2=" ">
    <subfield code="a">Mutate Zine</subfield>
    <subfield code="v">#3</subfield>
  </datafield>
  <datafield tag="100" ind1="1" ind2=" ">
    <subfield code="a">Arcana, Judith</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
    <subfield code="a">Feminism</subfield>
  </datafield>
  <datafield tag="650" ind1=" " ind2="0">
    <subfield code="a">Reproductive rights</subfield>
  </datafield>
  <datafield tag="655" ind1=" " ind2="7">
    <subfield code="a">Personal zine</subfield>
  </datafield>
  <datafield tag="520" ind1=" " ind2=" ">
    <subfield code="a">Personal narratives and essays about reproductive rights.</subfield>
  </datafield>
  <datafield tag="041" ind1=" " ind2=" ">
    <subfield code="a">eng</subfield>
  </datafield>
</record>

Features:

  • Standard MARC21 fields
  • Compatible with ILS (Integrated Library Systems)
  • Industry-standard cataloging format

Use for:

  • Library catalog imports
  • ILS integration
  • OCLC WorldCat
  • Cataloging workflows

Available for: Zines only


Content Negotiation

How It Works

  1. Client sends Accept header with desired format
  2. Server checks if format is supported for the endpoint
  3. Server returns data in requested format (or 406 if unsupported)

Multiple Accept Values

Prioritize formats with quality values:

curl -H "Accept: application/ld+json, application/json;q=0.8" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Meaning:

  • Prefer JSON-LD (quality 1.0, default)
  • Accept JSON as fallback (quality 0.8)

406 Not Acceptable

If requested format is not supported:

Response (406 Not Acceptable):

{
  "detail": "Could not satisfy the request Accept header."
}

Common causes:

  • Requesting CSV for individual record (only works for lists)
  • Requesting BibTeX for agents (only works for zines)
  • Typo in Accept header

Format Availability by Endpoint

All Endpoints

  • JSON ✅
  • JSON-LD ✅
  • DC XML ✅
  • RDF/Turtle ✅

List Endpoints Only

  • CSV ✅

Zines Only

  • BibTeX ✅
  • MARCXML ✅

Summary Table

JSONJSON-LDCSVDC XMLTurtleBibTeXMARCXML
Zines (list)✅✅✅✅✅✅✅
Zines (detail)✅✅❌✅✅✅✅
Agents (list)✅✅✅✅✅❌❌
Agents (detail)✅✅❌✅✅❌❌
Holdings (list)✅✅✅✅✅❌❌
Holdings (detail)✅✅❌✅✅❌❌
Repositories (list)✅✅✅✅✅❌❌
Repositories (detail)✅✅❌✅✅❌❌

Code Examples

Python

import requests

API_BASE = "http://localhost:8000/api"

# Get zine as JSON-LD
response = requests.get(
    f"{API_BASE}/zines/zine_mutate_3_1st/",
    headers={"Accept": "application/ld+json"}
)
jsonld = response.json()
print(jsonld["@context"])

# Export all zines as CSV
response = requests.get(
    f"{API_BASE}/zines/",
    headers={"Accept": "text/csv"}
)
with open("zines.csv", "w") as f:
    f.write(response.text)

# Get zine as BibTeX
response = requests.get(
    f"{API_BASE}/zines/zine_mutate_3_1st/",
    headers={"Accept": "application/x-bibtex"}
)
bibtex = response.text
print(bibtex)

# Get zine as Turtle
response = requests.get(
    f"{API_BASE}/zines/zine_mutate_3_1st/",
    headers={"Accept": "text/turtle"}
)
turtle = response.text
print(turtle)

JavaScript

const API_BASE = "http://localhost:8000/api";

// Get zine as JSON-LD
const jsonldResponse = await fetch(
  `${API_BASE}/zines/zine_mutate_3_1st/`,
  {
    headers: {
      "Accept": "application/ld+json"
    }
  }
);
const jsonld = await jsonldResponse.json();
console.log(jsonld["@context"]);

// Export all zines as CSV
const csvResponse = await fetch(
  `${API_BASE}/zines/`,
  {
    headers: {
      "Accept": "text/csv"
    }
  }
);
const csv = await csvResponse.text();
console.log(csv);

// Download CSV file
const blob = new Blob([csv], { type: "text/csv" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "zines.csv";
a.click();

cURL

# JSON-LD
curl -H "Accept: application/ld+json" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

# CSV (save to file)
curl -H "Accept: text/csv" \
  http://localhost:8000/api/zines/ > zines.csv

# BibTeX
curl -H "Accept: application/x-bibtex" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

# Dublin Core XML
curl -H "Accept: application/xml" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

# Turtle
curl -H "Accept: text/turtle" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

# MARCXML
curl -H "Accept: application/marcxml+xml" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/

Use Cases

Bulk Data Export (CSV)

Scenario: Export all zines for analysis in Excel.

curl -H "Accept: text/csv" \
  "http://localhost:8000/api/zines/?page_size=1000" > zines.csv

Import into Excel, Google Sheets, or data analysis tools.

Linked Data Integration (JSON-LD)

Scenario: Integrate zine metadata into a knowledge graph.

import requests
from rdflib import Graph

# Get zine as JSON-LD
response = requests.get(
    "http://localhost:8000/api/zines/zine_mutate_3_1st/",
    headers={"Accept": "application/ld+json"}
)
jsonld = response.json()

# Load into RDF graph
g = Graph()
g.parse(data=jsonld, format="json-ld")

# Query with SPARQL
for s, p, o in g:
    print(f"{s} {p} {o}")

Citation Management (BibTeX)

Scenario: Add zine to LaTeX bibliography.

# Get BibTeX entry
curl -H "Accept: application/x-bibtex" \
  http://localhost:8000/api/zines/zine_mutate_3_1st/ \
  >> references.bib

Use in LaTeX document:

\documentclass{article}
\usepackage{cite}
\begin{document}
Zines are important~\cite{zine_mutate_3_1st}.
\bibliography{references}
\end{document}

Library Catalog Import (MARCXML)

Scenario: Import zine records into library ILS.

# Export all zines as MARCXML
curl -H "Accept: application/marcxml+xml" \
  "http://localhost:8000/api/zines/" > zines.mrc

Import into ILS (Koha, Evergreen, Alma, etc.).


Next Steps

Ready to export data? Try different formats with the interactive API or continue to How-To Guides for advanced topics.
Copyright ©2026 ZineCore2 Contributors,