{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "$id": "https://convocaliteraria.com/contests.schema.json",
 "title": "Convocatorias literarias de Convoca",
 "description": "Convocatorias de premios y concursos literarios en castellano y en catalán, recogidas a diario de fuentes públicas. Lo usan https://convocaliteraria.com/contests.json (todas) y https://convocaliteraria.com/contests-open.json (solo las abiertas). La compilación es CC BY 4.0; cada convocatoria, de su fuente, que hay que enlazar.",
 "type": "object",
 "required": [
  "version",
  "generated_at",
  "count",
  "contests"
 ],
 "properties": {
  "$schema": {
   "type": "string",
   "description": "Este esquema."
  },
  "version": {
   "type": "string",
   "description": "Versión del formato. 1.1 desde el 22-10-2026: añade eligibility, fee, length, submission, conditions, prize_text, deadline_text, first_seen, language_codes, series_id y convoca_url, y en la envoltura, license y attribution. Los campos de la 1 no cambian."
  },
  "generated_at": {
   "type": "string",
   "description": "Cuándo se generó.",
   "format": "date-time"
  },
  "license": {
   "type": "string",
   "description": "La licencia de la compilación: CC BY 4.0."
  },
  "attribution": {
   "type": "string",
   "description": "Cómo citar la compilación. Cada convocatoria es de su fuente: enlaza su source_url."
  },
  "count": {
   "type": "integer",
   "description": "Cuántas convocatorias trae."
  },
  "contests": {
   "type": "array",
   "items": {
    "$ref": "#/$defs/convocatoria"
   }
  }
 },
 "$defs": {
  "convocatoria": {
   "type": "object",
   "required": [
    "id",
    "title",
    "deadline",
    "status",
    "source_name",
    "source_url"
   ],
   "properties": {
    "id": {
     "type": "string",
     "description": "Identificador de la convocatoria en Convoca. Cambia si la fuente renombra la ficha: para seguir un premio entre ediciones, usa series_id."
    },
    "title": {
     "type": "string",
     "description": "Título. En las fichas de la BDNS es un resumen de Convoca; el oficial va en official_record.official_title."
    },
    "language": {
     "type": "array",
     "items": {
      "type": "string"
     },
     "description": "Lenguas en que se puede escribir la obra: castellano, catala, galego, euskera, ingles."
    },
    "language_codes": {
     "type": "array",
     "items": {
      "type": "string"
     },
     "description": "Las mismas lenguas, en ISO 639-1: es, ca, gl, eu, en."
    },
    "genre": {
     "type": "array",
     "description": "Géneros.",
     "items": {
      "enum": [
       "poesia",
       "novela",
       "cuento",
       "teatro",
       "comic",
       "infantil_juvenil",
       "traduccion_ensayo",
       "no_ficcion",
       "obra_publicada",
       "otro"
      ]
     }
    },
    "themes": {
     "type": "array",
     "items": {
      "type": "string"
     },
     "description": "Temáticas (etiquetas)."
    },
    "deadline": {
     "type": [
      "string",
      "null"
     ],
     "description": "Último día para presentarse (AAAA-MM-DD). null si la fuente no da una fecha: mira deadline_text.",
     "format": "date"
    },
    "deadline_text": {
     "type": [
      "string",
      "null"
     ],
     "description": "El plazo como lo da la fuente cuando no es una fecha («veinte días hábiles desde la publicación del extracto»)."
    },
    "days_remaining": {
     "type": [
      "integer",
      "null"
     ],
     "description": "Días que faltan para el cierre, contados el día de generated_at. Negativo si ya cerró."
    },
    "status": {
     "type": "string",
     "description": "open: no ha cerrado o no tiene fecha. closed: el plazo pasó.",
     "enum": [
      "open",
      "closed"
     ]
    },
    "prize_type": {
     "type": "array",
     "description": "Qué se gana.",
     "items": {
      "enum": [
       "dinero",
       "publicacion",
       "montaje",
       "trofeo",
       "beca",
       "otro"
      ]
     }
    },
    "prize_max_eur": {
     "type": [
      "integer",
      "null"
     ],
     "description": "Dotación máxima en euros. Si la moneda no es el euro, es una conversión aproximada (prize_eur_approx)."
    },
    "prize_currency": {
     "type": [
      "string",
      "null"
     ],
     "description": "Moneda de la dotación si no es el euro (USD, MXN…)."
    },
    "prize_amount": {
     "type": [
      "integer",
      "null"
     ],
     "description": "Importe en esa moneda."
    },
    "prize_eur_approx": {
     "type": "boolean",
     "description": "true si prize_max_eur es una conversión aproximada."
    },
    "prize_text": {
     "type": [
      "string",
      "null"
     ],
     "description": "El premio, contado por la fuente o por las bases."
    },
    "entity": {
     "type": [
      "string",
      "null"
     ],
     "description": "Quién convoca."
    },
    "country": {
     "type": [
      "string",
      "null"
     ],
     "description": "País de quien convoca."
    },
    "scope": {
     "type": [
      "string",
      "null"
     ],
     "description": "Ámbito: España, Latinoamérica o Internacional.",
     "enum": [
      "España",
      "Latinoamérica",
      "Internacional",
      null
     ]
    },
    "source_name": {
     "type": "string",
     "description": "La fuente principal donde la encontramos."
    },
    "source_url": {
     "type": "string",
     "description": "La convocatoria en esa fuente, o sus bases. Es lo que hay que enlazar al citarla: mandan siempre las bases oficiales."
    },
    "sources": {
     "type": "array",
     "description": "Todas las fuentes que la traen.",
     "items": {
      "type": "object",
      "properties": {
       "name": {
        "type": "string",
        "description": "La fuente."
       },
       "url": {
        "type": "string",
        "description": "La convocatoria en esa fuente."
       },
       "type": {
        "type": [
         "string",
         "null"
        ],
        "description": "oficial o agregador."
       }
      }
     }
    },
    "last_seen": {
     "type": [
      "string",
      "null"
     ],
     "description": "El último día en que una fuente la dio."
    },
    "first_seen": {
     "type": [
      "string",
      "null"
     ],
     "description": "El día en que entró en Convoca. null si llegó con el catálogo inicial o con el estreno de una fuente."
    },
    "official_record": {
     "type": [
      "object",
      "null"
     ],
     "description": "Si la convocatoria sale de un registro público (hoy, la BDNS): lo que dice el registro y cómo citarlo. Quien reutilice el dato debe citar attribution con la fecha de updated.",
     "properties": {
      "name": {
       "type": "string",
       "description": "El registro: «BDNS»."
      },
      "code": {
       "type": "string",
       "description": "El código de la convocatoria en el registro."
      },
      "url": {
       "type": "string",
       "description": "Su ficha pública."
      },
      "official_title": {
       "type": "string",
       "description": "El título oficial, literal."
      },
      "attribution": {
       "type": "string",
       "description": "La fórmula de origen que pide el registro, literal."
      },
      "updated": {
       "type": [
        "string",
        "null"
       ],
       "description": "Última actualización según el registro (AAAA-MM-DD)."
      },
      "retrieved": {
       "type": [
        "string",
        "null"
       ],
       "description": "Cuándo la consultamos por última vez."
      }
     }
    },
    "series_id": {
     "type": [
      "string",
      "null"
     ],
     "description": "El premio al que pertenece, estable entre ediciones. Es el final de convoca_url."
    },
    "convoca_url": {
     "type": [
      "string",
      "null"
     ],
     "description": "La página del premio en Convoca: la convocatoria, las ediciones que hemos visto, el palmarés y los libros premiados."
    },
    "convoca_url_ca": {
     "type": [
      "string",
      "null"
     ],
     "description": "La misma página, en catalán."
    },
    "eligibility": {
     "type": "object",
     "description": "Quién puede presentarse. null es «no consta», nunca «no»: compruébalo en las bases antes de dar a nadie por excluido.",
     "properties": {
      "open_to": {
       "type": [
        "string",
        "null"
       ],
       "description": "Quién puede presentarse, en palabras de la fuente."
      },
      "no_restrictions": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true si la fuente dice que puede presentarse cualquiera. null si no lo dice."
      },
      "age_min": {
       "type": [
        "integer",
        "null"
       ],
       "description": "Edad mínima."
      },
      "age_max": {
       "type": [
        "integer",
        "null"
       ],
       "description": "Edad máxima."
      },
      "nationality": {
       "type": "array",
       "items": {
        "type": "string"
       },
       "description": "Nacionalidades exigidas. Vacía: no consta que se exija ninguna."
      },
      "residence": {
       "type": "array",
       "items": {
        "type": "string"
       },
       "description": "Lugar de residencia exigido (país, comunidad, municipio). Vacía: no consta que se exija."
      },
      "gender": {
       "type": [
        "string",
        "null"
       ],
       "description": "«mujeres» u «hombres» si la convocatoria se limita a unas u otros. null: no consta que se limite.",
       "enum": [
        "mujeres",
        "hombres",
        null
       ]
      },
      "unpublished_work": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: la obra tiene que ser inédita."
      },
      "published_work": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: el premio es para un libro ya publicado."
      },
      "by_nomination": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: no te presentas tú; las candidaturas las proponen terceros (instituciones, jurados, editoriales)."
      },
      "emerging_authors": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: solo para autoras y autores noveles o sin obra publicada."
      }
     }
    },
    "fee": {
     "type": "object",
     "description": "La cuota de inscripción.",
     "properties": {
      "free": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: gratuita. false: hay que pagar. null: no consta."
      },
      "amount_eur": {
       "type": [
        "number",
        "null"
       ],
       "description": "Importe en euros."
      },
      "details": {
       "type": [
        "string",
        "null"
       ],
       "description": "La cuota, en palabras de las bases."
      }
     }
    },
    "length": {
     "type": "object",
     "description": "La extensión de la obra.",
     "properties": {
      "min": {
       "type": [
        "integer",
        "null"
       ],
       "description": "Mínimo, en unit."
      },
      "max": {
       "type": [
        "integer",
        "null"
       ],
       "description": "Máximo, en unit."
      },
      "unit": {
       "type": [
        "string",
        "null"
       ],
       "description": "palabras, páginas, versos o caracteres."
      },
      "text": {
       "type": [
        "string",
        "null"
       ],
       "description": "La extensión como la dan las bases, si no se pudo normalizar."
      }
     }
    },
    "submission": {
     "type": "object",
     "description": "Cómo se presenta.",
     "properties": {
      "anonymous": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: con plica o seudónimo."
      },
      "by_email": {
       "type": [
        "boolean",
        "null"
       ],
       "description": "true: se puede enviar por correo electrónico."
      }
     }
    },
    "conditions": {
     "type": [
      "string",
      "null"
     ],
     "description": "Resumen de las condiciones, escrito por Convoca a partir de las bases con un modelo de lenguaje. Puede tener errores: mandan las bases."
    }
   }
  }
 }
}