Search Artzine

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.

  1. Read current capabilities and your account limits. Choose an available preset and an owned profile.
  2. Prepare the work, then reserve its files. Request an upload grant for each slot.
  3. Use the client's uploadDirect helper to send each file to the grant's storage endpoint. Keep the returned source version and pass it to complete the upload.
  4. Read the preparation until processing completes. Review its actual preview, title, credits and permissions. Preparation and upload leave the work unpublished.
  5. Publish the exact ready version after review. The returnedreceipt.resource_id identifies 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

OperationHTTPAccessMCP tool
getCapabilitiesGET /v1/capabilitiesPublic
searchPublicGET /v1/searchPublicartzine_search
getWorkGET /v1/works/{id}Publicartzine_get_work
deleteWorkDELETE /v1/works/{id}Idempotency key requiredwork:deleteartzine_delete_work
getOwnedWorkGET /v1/me/works/{id}work:readartzine_get_owned_work
listOwnedWorksGET /v1/me/workswork:readartzine_list_owned_works
getProfileGET /v1/profiles/{handle}Publicartzine_get_profile
getAccountGET /v1/meaccount:read
deleteAccountDELETE /v1/meIdempotency key requiredaccount:delete
createProfilePOST /v1/me/profilesIdempotency key requiredprofile:write
listOwnedProfilesGET /v1/me/profilesprofile:read
updateProfilePATCH /v1/me/profiles/{id}Idempotency key requiredprofile:write
deleteProfileDELETE /v1/me/profiles/{id}Idempotency key requiredprofile:delete
getOwnedProfileGET /v1/me/profiles/{id}profile:read
prepareWorkPOST /v1/preparationsIdempotency key requiredwork:prepareartzine_prepare_work
getPreparationGET /v1/preparations/{id}work:readartzine_get_preparation
revisePreparationPATCH /v1/preparations/{id}Idempotency key requiredwork:prepareartzine_revise_preparation
cancelPreparationDELETE /v1/preparations/{id}Idempotency key requiredwork:prepare
reserveUploadsPOST /v1/uploadsIdempotency key requiredasset:write
issueUploadGrantPOST /v1/uploads/{id}/grantasset:write
completeUploadPOST /v1/uploads/{id}/completeIdempotency key requiredasset:write
publishWorkPOST /v1/works/publishIdempotency key requiredwork:publishartzine_publish_work
withdrawWorkPOST /v1/works/{id}/withdrawIdempotency key requiredwork:withdrawartzine_withdraw_work
getDeletionGET /v1/deletions/{id}account:read
exportAccountPOST /v1/me/exportsIdempotency key requiredaccount:exportartzine_export_account
reportWorkPOST /v1/reportsPublic
saveWorkPUT /v1/saves/{work_id}Idempotency key requiredcollection:writeartzine_save_work
unsaveWorkDELETE /v1/saves/{work_id}Idempotency key requiredcollection:writeartzine_unsave_work
listSavesGET /v1/savescollection:readartzine_list_saves
mergeSavesPOST /v1/saves/mergeIdempotency key requiredcollection:write
getCollectionGET /v1/collections/{id}Publicartzine_get_collection
updateCollectionPATCH /v1/collections/{id}Idempotency key requiredcollection:writeartzine_update_collection
deleteCollectionDELETE /v1/collections/{id}Idempotency key requiredcollection:deleteartzine_delete_collection
getOwnedCollectionGET /v1/me/collections/{id}collection:readartzine_get_owned_collection
listOwnedCollectionsGET /v1/me/collectionscollection:readartzine_list_owned_collections
createCollectionPOST /v1/collectionsIdempotency key requiredcollection:writeartzine_create_collection
moveCollectionEntriesPOST /v1/collections/moveIdempotency key requiredcollection:writeartzine_move_collection_entries
duplicateCollectionPOST /v1/collections/{id}/duplicateIdempotency key requiredcollection:writeartzine_duplicate_collection
publishCollectionPOST /v1/collections/{id}/publishIdempotency key requiredcollection:publishartzine_publish_collection
withdrawCollectionPOST /v1/collections/{id}/withdrawIdempotency key requiredcollection:withdrawartzine_withdraw_collection
submitClaimPOST /v1/profiles/{id}/claimsIdempotency key requiredprofile:claim
getClaimGET /v1/me/claims/{id}profile:claim
cancelClaimDELETE /v1/me/claims/{id}Idempotency key requiredprofile:claim
createImportGrantPOST /v1/import-grantsIdempotency key requiredprofile:write
revokeImportGrantDELETE /v1/import-grants/{id}Idempotency key requiredprofile:write
getImportGrantGET /v1/import-grants/{id}profile:read
getMediaGrantGET /v1/works/{id}/media/{asset_id}Public
getPreparationMediaGrantGET /v1/preparations/{id}/assets/{asset_id}/grantwork:readartzine_preview_preparation_media
getUploadSlotGET /v1/uploads/{id}asset:writeartzine_get_upload
getAccountExportGET /v1/me/exports/{id}account:exportartzine_get_account_export
getAccountExportPageGET /v1/me/exports/{id}/pages/{page}account:exportartzine_get_account_export_page
getAccountExportFileGET /v1/me/exports/{id}/files/{asset_id}account:exportartzine_get_account_export_file
listWorkCollectionsGET /v1/works/{id}/collectionsPublicartzine_list_work_collections
getProfileMediaGrantGET /v1/profiles/{id}/media/{asset_id}Publicartzine_get_profile_media_grant
getSubjectGET /v1/subjects/{id}Publicartzine_get_subject
getFeaturedGET /v1/features/{surface}Publicartzine_get_featured