One .zip per skill. Inside: SKILL.md with the intent and the frontmatter, and the code that runs in the page.
Settings → Personalize → Skills. This is Cowork's own skill library, shared across every chat.
Click Add and choose the file you just downloaded. Cowork installs it once; no CLAUDE.md, no per-project setup.
The skill stays available in every session. Cowork runs it in your own Chrome, riding the session you are already signed into.
Check CUITs against ARCA's public APOC blacklist of apocryphal-invoice issuers. Downloads the full daily registry (~45k CUITs) once and indexes it locally. No login, no captcha.
{"cuits":"array of CUIT strings (11 digits, dots/dashes tolerated) to check against the base","cuit":"string optional, single-CUIT convenience alias"}{"generado":"string, date ARCA generated the file (DD/MM/AAAA)","totalEnBase":"int, CUITs in the registry","consultados":"int","apocrifos":"int, how many of yours are flagged","resultados":"[{cuit,apocrifo:true,desde,publicado}] only the flagged ones","limpios":"[cuit] the ones NOT in the base"}Screens a list of CUITs against APOC, ARCA's public registry of taxpayers flagged for issuing apocryphal (fake) invoices. Resolves in a single bridge call: the extractor downloads the whole daily ZIP itself (DownloadFile.aspx, ~45k CUITs), unzips it in-browser (DecompressionStream), indexes it by CUIT and returns only the CUITs you asked about.
No Clave Fiscal and no captcha: the bulk download is public. The per-CUIT web form does have an image captcha, so this skill deliberately ignores it and uses the full-file download instead. Nothing for the user to solve.
ARCA (ex AFIP) keeps its service URLs on
afip.gob.ar. That is why the catalog domain reads ARCA but the tab must be onservicioscf.afip.gob.ar. The ZIP carries no CORS, so it is same-origin. Navigate tohttps://servicioscf.afip.gob.ar/Facturacion/facturasApocrifas/default.aspxfirst, then call.
The extractor lives as text in the site's localStorage (key arca-apocryphal-invoices), rebuilt on each call with synchronous eval. Stored once, persists across navigation and restarts.
Default action: just call (step 1). The call reports NEEDS_STORE when the extractor is missing or out of date; only then store (step 2) and call again.
Versioning. Gated by VER (must match version in the frontmatter). When evaluate.js changes, bump both.
await (() => {
const KEY = "arca-apocryphal-invoices", VER = "1";
const s = localStorage.getItem(KEY);
if (!s || localStorage.getItem(KEY + ":ver") !== VER) return 'NEEDS_STORE';
const fn = eval('(' + s + ')');
return fn(document, { cuits: ["30707577963", "20428522568"] });
})()
Run this snippet verbatim. Never add an await before the eval. Only the outer await is allowed.
NEEDS_STORE)From a servicioscf.afip.gob.ar tab, evaluate the following with the bridge, replacing <FN> with the contents of evaluate.js (the ( async (root, params) => { ... } ) function). Keep VER equal to the call snippet's:
(() => {
const KEY = "arca-apocryphal-invoices", VER = "1";
const fn = (<FN>);
localStorage.setItem(KEY, String(fn));
localStorage.setItem(KEY + ":ver", VER);
return 'stored';
})()
Returns "stored". Then go back to step 1.
resultados is on the APOC base: treat it as a strong red flag. desde is when ARCA set the condition; publicado when it was published.limpios are the CUITs NOT in the base. That is NOT a clean bill, only that this specific list does not flag them.Descripcion column ARCA ships is empty for every row today, so the signal is binary (listed / not listed) plus the dates.generado tells you how fresh the file is; ARCA regenerates it daily. Each call re-downloads (~500 KB), so pass all the CUITs of one screening in a single call rather than one call per CUIT.NEEDS_STORE: extractor missing or version-mismatched in this browser; run step 2 once, then retry step 1.fetch_failed / http NNN: not on servicioscf.afip.gob.ar (no CORS). Open that host and retry.not_a_zip / zip_method_N: ARCA changed the download format; the extractor needs updating.pass params.cuits ...: no valid 11-digit CUIT was supplied.{ "type": "json", "jsonPath": "totalEnBase" }