For developers
Your work.
Your tools.
Bring Artzine into the way you already work. Read public work, prepare a publication, or put a zine together through the API and MCP.
Start with a search.
Public HTTP reads need no account. The TypeScript client validates requests and responses against the same contract as the API.
import { createClient } from '@artzine/sdk';
export async function findWork(baseUrl: string, query: string) {
const client = createClient({ baseUrl });
const { result } = await client.call('searchPublic', {
query,
medium: 'all',
limit: 20,
});
return result;
}Call findWork("https://artzine.com", 'light') with your search terms. The result contains work, artists, zines and subjects. Use next_cursor in the next search request to continue through the results.
Check current capabilities before preparing work. This response lists available presets and default limits. Read your account for its current limits and usage. Commands may also be temporarily restricted when admission is paused.
Connect a tool.
For a compatible MCP client, add this Streamable HTTP endpoint and complete the account authorization flow:
https://artzine.com/mcp
The MCP endpoint requires an authorized account, including for its reading tools. Choose the access the tool needs, then manage or disconnect it in Connected tools. OAuth clients can read the resource metadata to discover authorization settings.
For your own script, create a scoped API key in Connected tools and supply it through the client's token option, or as an HTTP Authorization: Bearer … header. Keep keys in your private runtime configuration. A distributed browser application should use an account authorization flow rather than embed a shared key.
Cross-origin browser requests are restricted. Use a server-side integration or a compatible authorized MCP client to connect your own tools.
Prepare, review, publish.
- Read current capabilities and your account limits. Choose an available preset and an owned profile.
- Prepare the work, then reserve its files. Request an upload grant for each slot.
- Use the client's
uploadDirecthelper to send each file to the grant's storage endpoint. Keep the returned source version and pass it to complete the upload. - Read the preparation until processing completes. Review its actual preview, title, credits and permissions. Preparation and upload leave the work unpublished.
- Publish the exact ready version after review. The returned
receipt.resource_ididentifies the work at/w/{id}. Keep that same address when updating the work; withdraw it when it should no longer be public.
File bytes go directly to storage. The API and MCP exchange metadata, versions and grants. Let background processing finish before publishing, and use the returned status when a format or file is refused.
For operations marked “Idempotency key required” below, supply an Idempotency-Key header, the client's idempotencyKey option, or an MCP idempotency_key. Keep the same key when retrying the same command with unchanged input. Use a new key for changed input. On a version conflict, read the current record and review your changes before retrying.
The client reports API failures as ArtzineApiError, with an HTTP status, structured error and request ID. Respect retry instructions and quota refusals. Additional response fields are accepted; required fields and known values remain validated.
One contract.
The HTTP API, typed client and MCP tools share the operations below. The OpenAPI document contains the complete request and response schemas. Account operations still enforce ownership and granted permissions.
Contract 0.1.0 · 56 operations
sha256:eea66c5812140736e839b2384202cefda1a5b6e4b5f3d93764a8ae87afe3fc78
| Operation | HTTP | Access | MCP tool |
|---|---|---|---|
getCapabilities | GET /v1/capabilities | Public | — |
searchPublic | GET /v1/search | Public | artzine_search |
getWork | GET /v1/works/{id} | Public | artzine_get_work |
deleteWork | DELETE /v1/works/{id}Idempotency key required | work:delete | artzine_delete_work |
getOwnedWork | GET /v1/me/works/{id} | work:read | artzine_get_owned_work |
listOwnedWorks | GET /v1/me/works | work:read | artzine_list_owned_works |
getProfile | GET /v1/profiles/{handle} | Public | artzine_get_profile |
getAccount | GET /v1/me | account:read | — |
deleteAccount | DELETE /v1/meIdempotency key required | account:delete | — |
createProfile | POST /v1/me/profilesIdempotency key required | profile:write | — |
listOwnedProfiles | GET /v1/me/profiles | profile:read | — |
updateProfile | PATCH /v1/me/profiles/{id}Idempotency key required | profile:write | — |
deleteProfile | DELETE /v1/me/profiles/{id}Idempotency key required | profile:delete | — |
getOwnedProfile | GET /v1/me/profiles/{id} | profile:read | — |
prepareWork | POST /v1/preparationsIdempotency key required | work:prepare | artzine_prepare_work |
getPreparation | GET /v1/preparations/{id} | work:read | artzine_get_preparation |
revisePreparation | PATCH /v1/preparations/{id}Idempotency key required | work:prepare | artzine_revise_preparation |
cancelPreparation | DELETE /v1/preparations/{id}Idempotency key required | work:prepare | — |
reserveUploads | POST /v1/uploadsIdempotency key required | asset:write | — |
issueUploadGrant | POST /v1/uploads/{id}/grant | asset:write | — |
completeUpload | POST /v1/uploads/{id}/completeIdempotency key required | asset:write | — |
publishWork | POST /v1/works/publishIdempotency key required | work:publish | artzine_publish_work |
withdrawWork | POST /v1/works/{id}/withdrawIdempotency key required | work:withdraw | artzine_withdraw_work |
getDeletion | GET /v1/deletions/{id} | account:read | — |
exportAccount | POST /v1/me/exportsIdempotency key required | account:export | artzine_export_account |
reportWork | POST /v1/reports | Public | — |
saveWork | PUT /v1/saves/{work_id}Idempotency key required | collection:write | artzine_save_work |
unsaveWork | DELETE /v1/saves/{work_id}Idempotency key required | collection:write | artzine_unsave_work |
listSaves | GET /v1/saves | collection:read | artzine_list_saves |
mergeSaves | POST /v1/saves/mergeIdempotency key required | collection:write | — |
getCollection | GET /v1/collections/{id} | Public | artzine_get_collection |
updateCollection | PATCH /v1/collections/{id}Idempotency key required | collection:write | artzine_update_collection |
deleteCollection | DELETE /v1/collections/{id}Idempotency key required | collection:delete | artzine_delete_collection |
getOwnedCollection | GET /v1/me/collections/{id} | collection:read | artzine_get_owned_collection |
listOwnedCollections | GET /v1/me/collections | collection:read | artzine_list_owned_collections |
createCollection | POST /v1/collectionsIdempotency key required | collection:write | artzine_create_collection |
moveCollectionEntries | POST /v1/collections/moveIdempotency key required | collection:write | artzine_move_collection_entries |
duplicateCollection | POST /v1/collections/{id}/duplicateIdempotency key required | collection:write | artzine_duplicate_collection |
publishCollection | POST /v1/collections/{id}/publishIdempotency key required | collection:publish | artzine_publish_collection |
withdrawCollection | POST /v1/collections/{id}/withdrawIdempotency key required | collection:withdraw | artzine_withdraw_collection |
submitClaim | POST /v1/profiles/{id}/claimsIdempotency key required | profile:claim | — |
getClaim | GET /v1/me/claims/{id} | profile:claim | — |
cancelClaim | DELETE /v1/me/claims/{id}Idempotency key required | profile:claim | — |
createImportGrant | POST /v1/import-grantsIdempotency key required | profile:write | — |
revokeImportGrant | DELETE /v1/import-grants/{id}Idempotency key required | profile:write | — |
getImportGrant | GET /v1/import-grants/{id} | profile:read | — |
getMediaGrant | GET /v1/works/{id}/media/{asset_id} | Public | — |
getPreparationMediaGrant | GET /v1/preparations/{id}/assets/{asset_id}/grant | work:read | artzine_preview_preparation_media |
getUploadSlot | GET /v1/uploads/{id} | asset:write | artzine_get_upload |
getAccountExport | GET /v1/me/exports/{id} | account:export | artzine_get_account_export |
getAccountExportPage | GET /v1/me/exports/{id}/pages/{page} | account:export | artzine_get_account_export_page |
getAccountExportFile | GET /v1/me/exports/{id}/files/{asset_id} | account:export | artzine_get_account_export_file |
listWorkCollections | GET /v1/works/{id}/collections | Public | artzine_list_work_collections |
getProfileMediaGrant | GET /v1/profiles/{id}/media/{asset_id} | Public | artzine_get_profile_media_grant |
getSubject | GET /v1/subjects/{id} | Public | artzine_get_subject |
getFeatured | GET /v1/features/{surface} | Public | artzine_get_featured |