Output Formats
The ZineCore2 API supports 7 output formats via HTTP content negotiation. Use the Accept header to specify your preferred format.
Supported Formats
| Format | Accept Header | Use Case | Endpoints |
|---|---|---|---|
| JSON | application/json | Default, API clients | All |
| JSON-LD | application/ld+json | Linked Data | All |
| CSV | text/csv | Spreadsheets, bulk export | Lists only |
| DC XML | application/xml | Dublin Core XML | All |
| RDF/Turtle | text/turtle | Semantic web | All |
| BibTeX | application/x-bibtex | Citation management | Zines only |
| MARCXML | application/marcxml+xml | Library systems | Zines 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
- Client sends Accept header with desired format
- Server checks if format is supported for the endpoint
- 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
| JSON | JSON-LD | CSV | DC XML | Turtle | BibTeX | MARCXML | |
|---|---|---|---|---|---|---|---|
| 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
- Zines API — Complete zines endpoint reference
- Filtering — Advanced filtering and search
- Getting Started — Complete API tutorial